使用scanf读取空格分隔的数字并将它们存储在数组中 – C

我正在尝试使用scanf()来获取包含一堆空格分隔的1-3位数字的用户输入,并将它们存储到一个int数组中,并在新行上打印每个单独的数字以进行测试,但它不起作用。 这是我到目前为止:

#include  #include  int main() { int sourceArr[500]; int i = 0; printf("\nEnter ciphertext: \n"); while (scanf("%d", &sourceArr[i++]) == 1); for (int j=0;j<500;j++) { printf("%d\n", sourceArr[j]); } } 

所以要求用户输入一系列数字,如下所示:

 Enter ciphertext: 23 122 32 

我想在sourceArr [0]中存储23,在sourceArr [1]中存储122,在sourceArr [2]中存储32,然后像这样打印每个:

 23 122 32 

但程序在输入输入后立即闲置,不会打印数字。

"%d"消耗领先的空格,例如' ''\n' ,而不仅仅是' '

因此,当用户输入“123 456 789” Enter时 ,再次调用scanf()等待更多输入。 它将继续等待,直到输入的非数字数据, stdin关闭或很少遇到IO错误。

由于stdin通常是缓冲的,因此stdinscanf()在按下Enter之前看不到任何输入。

 while (scanf("%d", &sourceArr[i++]) == 1); 

如果代码需要使用Enter结束输入,请使用fgets()读取一行 。 然后使用sscanf()strtol()解析它。 下面使用"%n"来记录扫描的char数。

 char buf[100]; printf("\nEnter ciphertext: \n"); if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOF(); char *p = buf; int n; while (sscanf(p, "%d%n", &sourceArr[i], &n) == 1) { i++; p += n; } for (int j = 0; j < i; j++) { printf("%d\n", sourceArr[j]); } 

成功时, scanf返回成功填充的参数列表的项目数。 由于匹配失败,读取错误或文件结束的范围,此计数可以匹配预期的项目数或更少(甚至为零)。

您可以将其更改为:

 #include  #include  int main() { int sourceArr[500]; int i = 0; printf("\nEnter ciphertext: \n"); while (scanf("%d", &sourceArr[i++]) == 1); for (int j=0;j 

然后,如果输入:1 2 3 4 5 6 x(并按Enter键)

它会显示你想要的。

如果你不喜欢'x',你可以在行中使用它:

 while (scanf("%d", &sourceArr[i++]) != EOF); 

然后键入类似于:12 23 345 554(按Enter键)然后在窗口中键入(ctrl + z)或在unix中键入(ctrl + d)。

看到这个主题: 标准输入流(stdin)的文件结束(EOF)

ctrl + z显式使scanf返回EOF,因为控制台没有EOF,需要以这种方式发送。