关于C中的getchar函数

ven*_*rty 3 c

我正在阅读K&RC语言书,代码片段如下:

char c;
while ((c = getchar()) != EOF) ...
Run Code Online (Sandbox Code Playgroud)

有人提到,对于EOF(我认为它是-1)是来自getchar的"带外"返回值,与getchar可以返回的所有可能值不同.

我的问题如下:

  1. 我用char运行我的程序,它运行成功,我的理解是signed char可以存储-127到+127所以它可以检查-1它是如何"带外"的?
  2. 任何人都可以提供一个简单的例子,如果我们用char c而不是上面的程序片段会失败int c吗?

谢谢!

MBy*_*ByD 6

你有一个小错误,getchar返回一个int,而不是char:

int c;
while ((c = getchar()) != EOF) ...
Run Code Online (Sandbox Code Playgroud)

ascii字符的有效值为0到127,EOF是其他(int)值.

如果你继续使用char,你可能会遇到麻烦(因为我进入)


cni*_*tar 5

那么,您的问题在C FAQ中得到了解答.

如果在上面的片段中,getchar的返回值被赋值给char,则可能出现两种失败模式.

  • 如果char类型被签名,并且if EOF被定义为(通常)为-1,则带有十进制值255(C中的'\ _377'或'\ xff')的字符将被符号扩展并且将比较等于EOF ,过早地
    终止输入.

  • 如果char类型是无符号的,则实际EOF值将被截断(通过丢弃其高阶位,可能导致255或者 0xff)并且不会被识别为EOF,从而导致有效的无限输入.