2012-09-02 54 views
2

我一直在阅读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权威书籍不能有错误,我错过了什么吗?

回答

4

从命令行读取时,您可以运行它并使用ctrl + d来指示EOF(文件结束)。

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

它是如何工作

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

+3

在Windows上,它将是Ctrl + Z,iirc。 –

+0

如果我还没有记错,并且没有更改,在Windows和DOS中,ctrl-Z被放置为流中的实际字符。在Unix中,ctrl-D实际上并不是作为字符发送的,并且实际上并不意味着文件结束,它意味着flush。这就是我写在http://stackoverflow.com/questions/1516122/how-to-capture-controld-signal无论如何... –

+1

谢谢,'CTRL + D'工作了一招! 'ctrl + z'不起作用 –

2

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

+2

Ctrl-D在大多数正确的操作系统上。 –

+1

Ctrl + C做的事情与Ctrl + D不同。 – Makoto

+0

哈哈耶。我只记得并编辑它。什么被认为是“适当”的操作系统? –