我是编程新手,但我想制作一个程序,将输入数字(长度)作为输入,然后存储所述长度的一系列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的值?
答案 0 :(得分:2)
使用
scanf(" %c", &matrix[i]);
^^^^
代替
scanf("%c", &matrix[i]);
^^
当格式以空白开头时,所有空白都将被跳过。
根据C标准(7.21.6.2 fscanf函数)
5由空格字符组成的指令由以下命令执行 读取输入内容,直到第一个非空白字符(仍保留 未读),或者直到无法读取更多字符为止。
10是输入数组长度后输入缓冲区中出现的(空格)换行符'\n'
的ASCII码。
答案 1 :(得分:0)
格式字符串为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()
的明显缺点是,您必须确定输入行的最大长度,分配一个缓冲区,然后再调用另一个函数。)