为什么我的 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()
的明显缺点是您必须决定输入行的最大长度,分配缓冲区并调用另一个函数。)
我是编程新手,但我想制作一个程序,将数字(长度)作为输入,然后存储一系列具有所述长度的 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()
的明显缺点是您必须决定输入行的最大长度,分配缓冲区并调用另一个函数。)