C 为什么我的字符数组的第一个值是10?
我对编程不熟悉,但我想做一个程序,输入一个数字,(长度),然后存储一系列a和b的长度。最后,它应该将这些数字输出为ascii数字。(so 97和98) 我想我应该malloc一个大小为长度的字符数组,然后在其上执行for循环,并将所有内容作为整数打印 但问题是我得到的第一个字母的值是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 +
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'
的值。