2017-04-14 88 views
0

的存在從一個功能的一部分將下面的代碼,我已經給出:澄清關於使用龜etc

char ch; 
ch = fgetc(fp); 
if (ch == EOF) 
    return -1; 

fp是作爲參數傳遞給函數的指針到文件/流。

然而,在檢查的fgetc()getc()getchar()的使用,似乎他們都返回類型爲int而不是char類型,因爲EOF不適合那些在字符使用的值0-255,所以是通常爲< 0(例如-1)。然而,這導致我問三個問題:

  1. 如果getchar()返回int,爲什麼char c; c = getchar();功能的有效使用?在這種情況下,C是否自動將類型轉換爲字符型,並且getchar()被替換爲getc(fp)fgetc(fp)
  2. fgetc()或其他兩個函數返回EOF時,程序中會發生什麼?它會再次嘗試並像以前一樣投下焦點,但然後失敗?如果有的話,什麼被存儲在ch
  3. 如果EOF實際上不是一個字符,那麼ch == EOF是一個有效的比較,因爲EOF不能用char變量表示?

回答

1

如果的getchar()返回INT,爲什麼是char℃; c = getchar();函數的有效用法?

這不是。僅僅因爲你可以編寫和編譯(以某種方式)讓你編譯它,並不會使代碼有效。

我相信上面的答案都是問題。

只是要添加,如果返回EOF,它不能存儲在char。一個char的符號性是實現定義的,因此,按照章節6.3.1.3,C11

  1. 當與整數類型的值被轉換爲比其它_Bool另一個整數類型,如果 值可以被表示由新型,它沒有改變。

  2. 否則,如果新類型是無符號的,所述值是通過反覆增加或 減去一個小於能夠在該新型 來表示直到該值是在新的類型的範圍的最大值更轉換.60)

  3. 否則,新類型被簽名並且其值不能被表示; 結果是實現定義的或者實現定義的信號被引發。

+0

好,所以如果我要改變'焦炭CH;''到INT CH;',那麼該代碼段會正常運行提供有效的'fp'?另外,如果我想使用由'fgetc()'返回的int作爲字符串或其他函數中的字符,只要它不是EOF就可以將其轉換爲字符是否有效? – ScottyN91

+0

@ ScottyN91是的,就是這麼多。 –

+1

根據char是否被簽名以及如何實現EOF,使用char可能會導致從不能正確讀取EOF的各種問題到被解釋爲EOF的合法字符值之一。 –