以下代码中的EOF将是什么?

时间:2018-07-23 01:05:49

标签: c character ascii eof getchar

我正在阅读C编程语言书,在下面给出的代码中,我不太了解如何在这里获得EOF?而且我也不能完全理解什么是EOF?是字符,整数还是条件?如果有条件,请解释。谢谢。

#include <stdio.h>
int main(int argc, char *argv[]){
int c;
while((c = getchar()) != EOF){
  printf("%d", c != EOF);
  putchar(c);
}
printf("\n%d\n", c != EOF);
}

3 个答案:

答案 0 :(得分:5)

getchar函数可以返回可以在您的系统上表示的任何可能的字符, plus 还有一个附加的,特殊的,特殊的“带外”返回值,表示存在没有更多的字符要返回。该值由符号宏标识符EOF引用。 <stdio.h>后面通常有一个类似

的定义
#define EOF (-1)

该值不一定为-1,但这将达到我们的目的。 (我们不必知道或关心实际值是多少,因为我们总是引用EOF,使我们与实际值保持隔离。)

无论值EOF有多少,都保证它与任何实际字符都不相同。因此,如果getchar返回的值不是EOF,则它是已读取的实际字符。但是,如果返回EOF,则表明输入流已到达文件末尾,表明不再有字符可以读取。

因此EOF绝对不是字符。它是一个整数,其值不同于任何char。我不会称它为“条件”,尽管您使用类似

的代码对其进行了测试
if(c == EOF)

if(c != EOF)

我想说这些表达式c == EOFc != EOF是条件。

这尤其令人困惑,因为通常您可以在键盘上键入一个特殊字符来生成文件结束指示。在Windows上是control-Z;在Unix和其他系统上,它是control-D。但这并不是说EOF在Windows系统上是control-Z,在Unix系统上是control-D。这些字符由终端驱动程序处理,并转换为指示,表明在经过另外几级处理和解释后,导致getchar返回EOF。但是证明EOF不是control-Z或control-D的一种方法是观察当您使用getchargetc进行读取时一个文件,即使在这种情况下,没有人在键盘上键入控制字符,您也会在文件末尾得到EOF指示。

最后,该讨论使我们想起使用int变量来承载getchar返回的值的重要性。您引用的代码正确声明了

int c;

,然后使用变量c来保存getchar返回的值。为什么在这里使用int?由于getchar返回字符,并且由于c是字符,所以声明是不是更有意义

char c;

像这样的似乎是有道理的,但这实际上是错误的。类型char可以容纳系统可以代表的任何字符。但是请记住,getchar可以返回任何字符值,{em> plus EOF值。如果将getchar的返回值分配给类型char的变量,最终会由于无意间将EOF指示映射到实际字符值而“刮掉”了EOF指示。接下来发生的情况是,您将一个实际字符(通常是ÿ)映射到EOF并在阅读一个字符时错误地停止了阅读,或者您将EOF映射到了实际字符,因此从不检测它,等等。进入无限循环,而不是在文件结尾处停止。

答案 1 :(得分:2)

EOF表示文件结束。读取输入流(文件,键盘等)时,流结束时将返回EOF。 EOF通常用int -1

表示

答案 2 :(得分:-1)

EOF为条件。现在让我们举个例子。 您有1个.txt文件,其中写入了50行,但是您不知道该.txt文件中有多少个字符。现在,您想将所有字符从该.txt文件打印到c语言程序中,但仍然不知道有多少个字符。为此,您必须使用EOF(平均文件末尾),这是for循环或while循环的条件。并且此循环将继续到.txt文件的最后一个字符。