2011-07-20 63 views
3

我讀數來說,K & RC語言書getchar函數,下面的代碼片段:關於用C

char c; 
while ((c = getchar()) != EOF) ... 

有人提到了EOF(我認爲這是-1)是一種「帶外」迴歸來自getchar的值,不同於getchar可返回的所有可能的 值。

我的問題是以下幾點:

  1. 我跑我的程序與char和成功運行,和我 理解爲signed char可以存儲-127到+127,因此它可以檢查 爲-1是怎麼回事「帶外」?
  2. 任何人都可以提供一個簡單的例子,如果我們使用char c而不是int c上述程序片段將失敗嗎?

謝謝!

回答

2

無論值EOF取決於您的平臺。看看stdio.h,看看它的實際定義。

+1

EOF不能爲0。雖然它並不必須是-1,但它必須是負的(C99,§7.19.1/ 3)。 –

6

你有一個小的失誤,getchar返回int,而不是一個char

int c; 
while ((c = getchar()) != EOF) ... 

的有效值的ASCII字符是從0到127,EOF是一些其他的(INT)值。

如果繼續使用char,你可能會陷入麻煩(如I got into

+0

* ASCII *的值範圍實際上是0-127,但實際上它返回字節(0-255)。從手冊頁:*字符值返回爲無符號字符轉換爲int。如果流處於文件結尾或發生讀取錯誤,則例程返回EOF。* – DarkDust

+0

確實,EOF值可能是一個int值,而不是char值。 – MByD

+1

它*是一個int值,這就是點:「帶內」值範圍是0-255,但「帶外」EOF通常是-1,因此不能誤認爲帶內值。您也可以將EOF定義爲256或任何其他非帶內值:-) – DarkDust

5

那麼,你的問題是在C FAQ回答。

如果在上面的片段中將getchar的 返回值分配給char,那麼可能會出現兩種失敗模式。

  • 如果類型炭被簽名,並且如果EOF被定義(這是通常)爲-1, 與十進制值的字符255( '\ 377' 或 '\ XFF' 在C)將 進行符號擴展並且將比較等於EOF,提前終止輸入

  • 如果類型char是無符號的,實際的EOF值將被截斷(由 具有其高位比特丟棄,可能導致255或0xff),並且將不會被識別爲EOF,導致有效地無限輸入。

+0

一如既往的非常好的解釋。 –

+0

@耶穌拉莫斯C常問問題是真棒:-) – cnicutar

+0

當然。包含你有時無法想到的所有小東西。 –