2012-09-02 100 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

哈哈耶。我只記得並編輯它。什麼被認爲是「適當」的操作系統? –