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

Why is the first value of my char array 10?

我是编程新手,但我想制作一个程序,将数字(长度)作为输入,然后存储一系列具有所述长度的 a 和 b。最后它应该将数字输出为 ascii 数字。 (所以 97 和 98) 我想我应该 malloc 一个大小为 length 的 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 98 97。为什么我在数组的第一个位置得到值 10?

使用

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

而不是

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

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

来自C标准(7.21.6.2 fscanf函数)

5 A directive composed of white-space character(s) is executed by reading input up to the first non-white-space character (which remains unread), or until no more characters can be read.

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

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

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

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

这会在读取第一行时清除问题,而不是将其传递给下一个输入函数来处理。否则你所有的输入函数都被捆绑在一起,如果下一个输入是针对可能带有白色 space 的整行,你需要知道你是否希望清除一个预先存在的换行符。 (您也可以将后面的 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() 的明显缺点是您必须决定输入行的最大长度,分配缓冲区并调用另一个函数。)