这个程序是如何工作的?

时间:2012-09-02 20:39:33

标签: c infinite-loop ansi

我一直在阅读Kernighan和Ritchie的C编程语言。很早就我自己遇到了一个无效的程序,即使我直接从书中复制它。以下是说明的屏幕上限 - 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的权威书籍不会有错误,我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

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

如果你正在从一个文件中读取一个字节流,那么它会自动存在。但是,由于您是从命令行读取的,因此需要使用上面的键序列手动发出文件结束信号。

实际如何运作

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

答案 1 :(得分:2)

EOF是文件结尾。尝试Ctrl-D。