如何在C语言中使用scanf获取整数数组输入?

3

我正在使用scanf获取多个整数输入,并将其保存在数组中。

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

输入的整数通过空格分隔,例如:
12 345 132 123

我在另一个帖子中看到了这个解决方案。

但问题是while循环没有终止。

这个语句有什么问题?


输入EOF (ctrl + zctrl + d) 并按下回车键。 - BLUEPIXY
@BLUEPIXY,有没有可能在不使用EOF的情况下完成它?例如,一个新用户使用程序时不添加EOF?是否有其他方法可以避免使用EOF(可能不使用“while”)? - Ross
输入格式为 12 345 132 123.,其中 . 表示输入结束标志(当使用 scanf 函数时会出现错误)。 - BLUEPIXY
4个回答

8
OP正在使用 Enter 或'\ n'表示输入结束,使用空格作为数字分隔符。 scanf(“%d”,...不区分这些空白字符。 在OP的 while()循环中, scanf()会消耗'\ n'等待其他输入。
相反,使用 fgets()读取一行,然后使用 sscanf(), strtol()等进行处理。 ( strtol()最好,但OP正在使用 scanf()系列)
char buf[100];
if (fgets(buf, sizeof buf, stdin) != NULL) {
  char *p = buf;
  int n;
  while (sscanf(p, "%d %n", &array[i], &n) == 1) {
     ; // do something with array[i]
     i++;  // Increment after success @BLUEPIXY
     p += n;
  }
  if (*p != '\0') HandleLeftOverNonNumericInput();
}

4
//Better do it in this way
int main()
{
  int number,array[20],i=0;
  scanf("%d",&number);//Number of scanfs
  while(i<number)
  scanf("%d",&array[i++]);
  return 0;
}

数字需要在while循环中使用,例如while( i < 数字),并且scanf语句作为while循环的主体,例如scanf("%d", &array[i++]); 否则我们会陷入无限循环问题。 - user3629249

1
你应该尝试像这样编写你的语句:

while ( ( scanf("%d",&array[i++] ) != -1 ) && ( i < n ) ) { ... }

请注意边界检查。
正如人们一直说的那样,当从普通人解析真实输入时,scanf并不是你的朋友。它在处理错误情况时存在许多陷阱。
另请参阅:

1
即使在不使用EOF的情况下,以下代码也会进入无限循环。 - Ross

0

你的代码没有任何问题。只要输入的整数数量不超过数组大小,程序就会一直运行,直到输入 EOF 为止。例如:

int main(void)
{
    int array[20] = {0};
    int i=0;
    while(scanf("%d", &array[i++]) == 1);
    return 0;   
}  

正如BLUEPIXY所说,您必须输入正确的EOF按键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接