2

我一直在阅读 Kernighan 和 Ritchie 的 The C Programming Language 并且很早就拥有了我遇到了一个不起作用的程序,即使我直接从书中复制了它。这是描述的屏幕截图 - http://i.imgur.com/SBQSE.png

它陷入无限循环,因为我输入的任何内容显然都是键盘输入,并且它正在检查 EOF,这显然不是键盘输入。

#include <stdio.h> 
/* copy input to output; 1st version  */ 
main() 
{ 
    int c; 
    c = getchar(); 
    while (c != EOF) { 
        putchar(c); 
        c = getchar(); 
    } 
}

当然,像这样的 C 权威书籍不会有错误,我错过了什么吗?

4

2 回答 2

4

从命令行读取时,您将运行它并使用它ctrl + d来发出 EOF(文件结束)信号。

如果您正在从文件中读取字节流,那么它会自动将其包含在其中。但是,由于您是从命令行读取的,因此需要使用上面的键序列手动指示文件结束。

它实际上是如何工作的

EOF 通常在(至少 glibc 中)表示 -1,这就是为什么你不能只说while(c) { do work; }因为任何非零值都是真的 - 因此 EOF 是真的,就像调用返回的任何其他正数字符一样getchar()。这就是为什么您必须直接检查 c 是否匹配 EOF (-1) 与c != EOF当您发送 EOF 信号时出现在流中的代码ctrl + d

于 2012-09-02T20:41:23.937 回答
2

EOF 是文件结束符。试试 Ctrl-D。

于 2012-09-02T20:40:21.457 回答