【问题标题】:scanf() in while loop not terminating?while循环中的scanf()没有终止?
【发布时间】:2012-11-25 07:19:55
【问题描述】:

我有一个 while 循环,它扫描输入的整数集。它扫描并打印最后带有“...”的所有数字,然后跳到下一行。但是,该脚本不会:在 while 循环之后执行并打印 TEST。

例如,我输入: 3 44 62 1

它打印: 3...

44...

62...

1...

何时打印: 3...

44...

62...

1...

测试

while(scanf("%d", &n) != -1) {
    x[i] = n;
    i++;

    printf("%d", n);
    printf("...\n");
}

printf("TEST");

我做错了什么?

【问题讨论】:

  • 什么是-1-1 是从哪里来的?为什么您希望您的scanf 在输入结束时返回-1?换句话说,你为什么希望这段代码按照你想要的方式工作?
  • -1 由 scanf() 返回以表示字符结束。它在那时停止读取整数。
  • 首先,没有“字符结尾”这样的东西吗?其次,fscanf文件结束处返回EOF。不是-1,而是EOF。第三,scanf 从标准输入读取,当它从键盘读取时,它永远不会结束。您可以通过与系统相关的方式(如 Ctrl+D 或 Ctrl+Z)在标准键盘输入中“模拟”文件结束条件。但是没有它,仅仅因为您停止输入它并不意味着您的输入结束。 scanf 将永远等待更多输入,这正是您的情况。
  • 在 EOF 处多次返回 -1,但并非总是如此。据我所知,在 C 中,实际规范只是它返回一个小于 0 的数字
  • 我记得,EOF 只需要不等于任何其他字符值。无论如何,当你的意思是 EOF 时写 -1 是非常糟糕的风格。

标签: c while-loop int scanf


【解决方案1】:
  1. scanf("%d", &n) != 1 是错误的。应该是scanf("%d", &n) == 1
  2. 您希望循环结束只是因为您按了 Enter 键?如所写,只有当 scanf 由于到达输入文件的末尾而无法读取数字时,您的程序才会停止。如果您使用的是 Unix,则可以通过按 Ctrl-D 从终端发出 EOF 信号。如果你在 Windows 上,它是 Ctrl-Z Enter。 (另外,不要依赖 EOF 为 -1;它不可移植。)

【讨论】:

  • 将其更改为 scanf("%d", &n) == 1 没有区别。按 Ctrl-D 没有帮助。
  • @JoshuaShor:建议的更改应该可以解决您的问题。你在哪个平台?紧急情况请输入helpquit;这些都不是数字,因此scanf() 将报告返回的 0 值,从而打破循环。但是,如果您在行首时输入 Control-D(在换行符之后,并假设您没有将终端的 EOF 设置设置为其他值),那么系统将返回 0 个字符到read()系统调用,将被解释为EOF。
  • 如果你不在一行的开头,你也可以按两次 Ctrl-D(这很有趣)。
  • 有趣的是,按 Ctrl-D 不起作用;多次点击它,直到我点击“TEST”为止。
  • 看看stty -a 的输出。您应该在其中某处看到类似eof = ^D 的内容;如果你看到一个不同的角色,那么你就有一个明显的问题。 SSH 总是有可能使事情变得混乱,尽管这不太可能。
猜你喜欢
  • 1970-01-01
  • 2022-07-18
  • 2017-03-10
  • 1970-01-01
  • 2016-01-15
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多