【问题标题】:scanf causing an infinite loop and not returning -1 or EOFscanf 导致无限循环并且不返回 -1 或 EOF
【发布时间】:2018-02-09 15:25:31
【问题描述】:

我的程序应该从标准输入读取整数,然后

例子:

输入文件包含:"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"

这适用于普通标准输入,直到我尝试使用看起来像这样的 .txt 文件从标准输入重定向中读取

input .txt file

输入.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

【问题讨论】:

  • 它符合并运行良好。你确定删除了@usr2564301 的行号吗?
  • 查找scanf 函数以查看它返回的内容。
  • 您能否编辑您的代码以删除行号。当然,您的 IDE 中有一个选项。
  • 比较scanfEOF'\n' 的返回值没有什么意义。
  • @JohnColeman:标准说scanf() 返回EOF(不是-1,当然EOF == -1 是一样的)。相比之下,POSIX 说getline() 返回-1,即使在EOF != -1 的系统上也是如此。没错,EOF 只需要为负数,但绝大多数情况下都是-1。但是您应该正确进行比较。

标签: c scanf infinite-loop


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    代码应该可以正常工作,除了错误地打印数字(使用%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.
    

    如您所见,它打印了预期的输出。三个cmets:

    1. 仔细检查您是否在修改后重新编译了程序,并且您正在执行/调试正确的二进制文件。它不断发生。

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

    3. 向量没有初始化,所以期望那里有一些随机数,不一定有意义。

    更新:刚刚看到Steve Summitprintf() 中关于%d 的评论。但这不应该导致无限循环,只是打印废话字符而不是数字。如果%cscanf() 中,那将是一个问题。

    【讨论】:

      猜你喜欢
      • 2013-07-31
      • 2013-12-20
      • 1970-01-01
      • 2015-12-27
      • 2012-10-05
      • 2016-06-05
      • 1970-01-01
      • 2021-09-30
      • 2018-03-24
      相关资源
      最近更新 更多