C 为什么我的字符数组的第一个值是10?

C 为什么我的字符数组的第一个值是10?,c,char,scanf,newline,C,Char,Scanf,Newline,我对编程不熟悉,但我想做一个程序,输入一个数字,(长度),然后存储一系列a和b的长度。最后,它应该将这些数字输出为ascii数字。(so 97和98) 我想我应该malloc一个大小为长度的字符数组,然后在其上执行for循环,并将所有内容作为整数打印 但问题是我得到的第一个字母的值是10。 非常感谢你的帮助 int main() { int length; scanf("%d", &length); char *matrix = malloc((length +

我对编程不熟悉,但我想做一个程序,输入一个数字,(长度),然后存储一系列a和b的长度。最后,它应该将这些数字输出为ascii数字。(so 97和98) 我想我应该malloc一个大小为长度的字符数组,然后在其上执行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;
}
intmain()
{
整数长度;
扫描频率(“%d”和长度);
char*matrix=malloc((长度+1)*sizeof(char));
for(int i=0;i
当在第一行输入3,在下一行输入aba时,我得到10 97 98。 然而,我预计是97。为什么我在数组的第一个位置得到一个值10?

使用

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

scanf("%c", &matrix[i]);
       ^^
当格式以空白开头时,将跳过所有空白

来自C标准(7.21.6.2 fscanf功能)

5由空格字符组成的指令由 读取输入直到第一个非空白字符(保留 未读),或直到无法读取更多字符

10是输入数组长度后输入缓冲区中存在的(空白)新行字符“\n”
的ASCII码

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

这里发生的情况是,您的终端一次收集一整行输入,将其传递给程序,然后
scanf()
只从缓冲区读取数字,将换行符保留在那里,以便下一个
scanf()
查看。如果输入
10abc
,也会发生同样的情况:空格、
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;
}
#包括
#包括
内部主(空)
{
整数长度;
char-linebuf[100];
fgets(linebuf,100,标准);
长度=strtol(linebuf,NULL,10);
字符*矩阵=malloc(长度+1);
for(int i=0;i
(fgets()的明显缺点是,您必须确定输入行的最大长度,分配缓冲区并调用除此之外的另一个函数。)

提示:按“Enter”键生成ASCII值为10的字符。更一般地说,请检查字符
'\n'
的值。