2009-11-01 57 views
3

我工作到K &的r第2版我的方式,我已經難倒這個看似簡單的例子:幫助K&計數盧比字符數例

#include <stdio.h> 

main(){ 
    double c; 
    for(c = 0; ((getchar() != EOF) && (getchar() != '\n')); ++c) 
     ; 
    printf("%.0f\n",c); 
} 

它根本無法正常工作。我在(getchar() != '\n')部分加入了結束程序,當我按下回車鍵時,但確實還是有幫助。

下面是一些示例輸出,使用Mac OSX 10.6開發工具附帶的gcc

pool-000:Desktop user$ ./a.out 
a 
0 
pool-000:Desktop user$ ./a.out 
asdf 

2 
pool-000:Desktop user$ ./a.out 
asfasf 

3 

所以有些東西顯然是錯的。我在第18頁,如果有幫助的話。這不是作業,這是爲了好玩!

謝謝:)

+0

看起來像你有幾個基本問​​題;你究竟想要完成什麼? – 2009-11-01 21:43:40

+2

我想你並沒有用Ctrl + D來終止輸入。恢復到原始實現(不帶'!'\ n''),並在輸入結束時按Ctrl + D。 – 2009-11-01 21:47:24

+0

謝謝,Mehrdad,這是問題。非常感謝!如果您提交它作爲答案,我會接受它。 – Isaac 2009-11-01 21:54:45

回答

5

getchar()每次調用將等待一個字符被讀取,所以你讀到比你想象的每循環的多個迭代。

此外,至少在我看來,一個計數器是(幾乎)從來沒有double,你應該使用一個整數類型,如普通老int

+0

+1,或許會將'getchar()'信息帶到頂部? *是他的代碼的主要問題。使用'double'是次要的。 – user7116 2009-11-01 21:48:51

+0

這是導致問題的第二個'getchar()' - 謝謝!儘管如此,K&R的代碼還是有「雙」的。 – Isaac 2009-11-01 21:52:11

+0

@sixlettervariables:同意,並完成。 – unwind 2009-11-02 07:39:15

3

執行兩個「getchar()」操作的問題是,在讀取++ c之前,您將閱讀兩個獲取字符的條件測試。

拋棄「EOF」比較,它應該按照您的預期工作。

+0

另外一個好點!謝謝 - 我現在對getchar()的工作方式有了更好的瞭解,並且更好地瞭解C如何解釋ctrl-D/EOF。 – Isaac 2009-11-01 22:00:38

+0

不客氣! – 2009-11-01 22:02:02