为什么我的char数组的第一个值是10?

我是编程新手,但我想制作一个程序,将输入数字(长度)作为输入,然后存储所述长度的一系列a和b。最后,它应该将数字输出为ascii数字。 (因此97和98) 我以为我应该分配一个大小为长度的char数组,然后对其进行for循环并将所有内容打印为整数。

但是问题是我得到的值10是第一个字母的值。 非常感谢您的帮助!

int main()
{
    int length;
    scanf("%d",&length);
    char *matrix = malloc((length + 1 ) * sizeof(char));

    for (int i = 0; i < length; i++)
    {
            scanf("%c",&matrix[i]);
    }

    for (int i = 0; i < length; i++)
    {
            printf("\n%d",matrix[i]);
    }

    return 0;
}

在第一行输入3并在下一行输入aba时,我得到10 97 98。 但是我希望它是97 9897。为什么在数组的第一位得到10的值?

lawdragon 回答:为什么我的char数组的第一个值是10?

使用

scanf(" %c",&matrix[i]);
      ^^^^

代替

scanf("%c",&matrix[i]);
       ^^

当格​​式以空白开头时,所有空白都将被跳过。

根据C标准(7.21.6.2 fscanf函数)

  

5由空格字符组成的指令由以下命令执行   读取输入内容,直到第一个非空白字符(仍保留   未读),或者直到无法读取更多字符为止。

10是输入数组长度后输入缓冲区中出现的(空格)换行符'\n'的ASCII码。

,

格式字符串为scanf()的第一个%d在输入缓冲区中留下换行符。

这里发生的是,您的终端一次收集了一行完整的输入,并将其传递给程序,然后scanf()仅从缓冲区中读取数字,在其中保留换行符以供下一行使用scanf()看。如果您输入10 abc,也会发生同样的情况:空格abc和换行符将留在此处。

这种不匹配并不是人们通常期望的,这是使scanf()令人讨厌的事情之一。我建议使用fgets()代替,首先读取整行,匹配终端给出的内容,然后使用sscanf()strtol()(或atoi())解析其中的数字

这将在读取第一行时清除问题,而不是将其传递给下一个输入函数进行处理。否则,您所有的输入功能都将绑在一起,如果下一个输入将用于整行并带有空白,则需要知道是否希望清除现有的换行符。 (您也可以用scanf("%c")替换后面的getchar(),但这与缓冲无关紧要。)

也就是说,如果您输入的行的字符数不如预期的多,那么scanf("%c") / getchar()循环可能仍会看到换行符,因此,如果您不想看到它们,完全过滤掉它们。

所以,像这样:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int length;
    char linebuf[100];
    fgets(linebuf,100,stdin);
    length = strtol(linebuf,NULL,10);
    char *matrix = malloc(length + 1);

    for (int i = 0; i < length; i++)
    {
        matrix[i] = getchar();
    }

    for (int i = 0; i < length; i++)
    {
        printf("\n%d",matrix[i]);
    }
    printf("\n");

    return 0;
}

fgets()的明显缺点是,您必须确定输入行的最大长度,分配一个缓冲区,然后再调用另一个函数。)

本文链接:https://www.f2er.com/3153759.html

大家都在问