scanf导致无限循环而不返回-1或EOF

时间:2018-02-09 15:25:31

标签: c scanf infinite-loop

我的程序应该从stdin读取整数然后

示例:

输入文件包含:"3 1 4 2 5\n"
功能输出:"{3, 1, 4, 2, 5}\n"

输入文件包含:"1 2 3 4 5 6 7 8\n"
功能输出:"{1, 2, 3, 4, 5, 6, 7, 8}\n"

输入文件包含:无(空文件)
功能输出:"No integers were provided.\n"

这对普通的stdin工作正常,直到我尝试使用看起来像这样的.txt文件读取stdin重定向

input .txt file

input.txt:1 2 3 4 5 6 7 8 9 10

当运行GDB时我看到了:

My GDB

并且它一直用我的整数数组填充10,直到我的程序崩溃。

这是我的代码:

#include <stdio.h>

void printNums() {
  int nums[100];
  int num;
  int count = 0;
  int x;
  if ((scanf("%d", &num)) == EOF) {
    printf("No integers were provided.\n");
    return;
  } else {
    nums[count] = num;
    count++;
  }
  while ((scanf("%d", &num) == 1)) {
    if (num != ' ') {
      nums[count] = num;
      count++;
    }
  }
  printf("{");
  for (x = 0; x < count; x++) {
    if (x == count - 1) {
      printf("%c", nums[x]);
    } else {
      printf("%c, ", nums[x]);
    }
  }
  printf("}\n");
}

请记住,我不允许导入除stdio以外的任何其他内容,并且最好是用户scanf或getchar

2 个答案:

答案 0 :(得分:0)

无限循环的原因在于参数%d,它是带符号的十进制整数,而不是您输入的字符。是的,正如@SteveSummit注意到的那样,他应该把它作为另一个答案,使用%c将解决问题。我认为,问题的根本原因是在输入%d时未使用的隐式换行符。 %c确实关心它。

答案 1 :(得分:0)

代码应该可以正常工作,但错误地打印数字除外(使用%d代替%c):

#include <stdio.h>

void printNums() {
  int nums[100];
  int num;
  int count = 0;
  int x;
  if ((scanf("%d", &num)) == EOF) {
    printf("No integers were provided.\n");
    return;
  } else {
    nums[count] = num;
    count++;
  }
  while ((scanf("%d", &num) == 1)) {
    if (num != ' ') {
      nums[count] = num;
      count++;
    }
  }
  printf("{");
  for (x = 0; x < count; x++) {
    if (x == count - 1) {
      printf("%d", nums[x]);
    } else {
      printf("%d, ", nums[x]);
    }
  }
  printf("}\n");
}

int main(int argc, char** argv) {
    printNums();
}

我添加了main()函数,并编译和调用如下:

$> gcc -Wall -o count count.c
$> echo '1 2 3 4 5 6 7 8 9 10' | ./count
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
$> echo '3 1 4 2 5' | ./count
{3, 1, 4, 2, 5}
$> echo -n '' | ./count
No integers were provided.

如您所见,它会打印预期的输出。三条评论:

  1. 仔细检查您在修改程序后重新编译程序,以及正在执行/调试正确的二进制文件。它经常发生。

  2. 您是如何调用程序并获取输入的?也许你有问题。

  3. 矢量未初始化,因此需要一些随机数,不一定有意义。

  4. 更新:刚看到Steve Summit关于%dprintf()的评论。但这不应该导致无限循环,只是打印垃圾字符而不是数字。如果%c位于scanf(),而不是。{/ p>,则会出现问题