【问题标题】:Getchar not stopping on comparisonGetchar 不会停止比较
【发布时间】:2017-12-17 00:07:12
【问题描述】:
#include <stdio.h>

main() {
long nc;

nc = 0;
while (getchar() != -1)
    ++nc;
printf("%ld\n", nc);
}

以上是我在 K&R C 书中的代码,例如 1.5.2,但我更改了代码,因此 getchar() 正在检查 -1。但是,当输入负数 (-1) 时,代码不会停止在 getchar() 中读取。如何让代码停止,为什么它没有停止?

【问题讨论】:

  • ...您不应该键入 -1 ...这是EOF 代码,如just about every description 中所述。
  • 看,-1 是两个字符。 getchar() 将首先返回 - (45),然后是 1 (49)。
  • getchar() 得到一个 char - 单个字符。这就是为什么它无法读取“-1”,一个2个字符的字符串
  • 使用EOF 或您选择的单个字符修复
  • 在终端,您可以通过键入合适的字符来指示 EOF,通常是 Unix 上的 control-D 和 Windows 上的 control-Z。如果您在此之前没有输入换行符(回车),则需要按两次控制字符。当然,这是有原因的,但解释起来很麻烦。

标签: c


【解决方案1】:

getchar() 函数从stdin 中读取一个字节,并返回该字节的值。例如,在基于ASCII 的系统上,字节值32 表示空格,值33 表示感叹号(!),值34 表示双引号(")等等。特别是,字符-1(组成字符串"-1")的字节值分别为45 和48。

数字 -1 不对应于任何实际字符,而是对应于特殊值 EOFend of file 的首字母缩写),当没有更多字节可从 @987654334 读取时,getchar() 将返回该值@。 (实际上,C 标准不保证 EOF 的值等于 -1,尽管在大多数系统上它是。但它保证小于零。)

所以你的循环,如所写,将继续运行,直到没有更多的输入可供读取。如果您从终端运行代码,这基本上意味着它将继续运行,直到您键入 Ctrl+D (在 Unixish 系统上)或 Ctrl kbd>+Z(在 Windows 上)。或者,您可以使用来自文件的输入运行您的程序(例如使用my_program &lt; some_file.txt),这将导致循环运行,直到它逐字节读取整个文件。

如果您想从stdin 中读取一个数字,并循环直到该数字等于-1,则改为使用you should use scanf()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 2017-12-13
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多