天天看點

基礎知識 | 每日一面(77)

基礎知識 | 每日一面(77)

古代的劍客們與

對手相逢時,無

論對手多麼強大,

明知不敵,也要亮出自己的劍!

讀者:這樣的代碼有什麼問題?char c; while((c = getchar()) != EOF)

小林:第一, 儲存 getchar 的傳回值的變量必須是 int 型。getchar() 可能傳回任何字元值, 包括 EOF。如果把 getchar 的傳回值截為 char 型, 則正常的字元可能會被錯誤的解釋為 EOF, 或者 EOF 可能會被修改 (尤其是 char 型為無符号的時候), 進而永不出現。

讀者:我有個讀取直到 EOF 的簡單程式, 但是我如何才能在鍵盤上輸入

那個 “EOF” 呢?

小林:其實, 你的C程式看到的 EOF 的值和你用鍵盤發出的檔案結束按鍵組合之間沒有任何直接聯系。根據你的作業系統, 你可能使用不同的按鍵組合來表示檔案結束, 通常是 Control-D 或 Control-Z。

讀者:為什麼這些代碼 while(!feof(infp)) { fgets(buf, MAXLINE,

infp); fputs(buf, outfp); } 把最後一行複制了兩遍?

小林:在 C 語言中, 隻有輸入例程試圖讀并失敗以後才能得到檔案結束符。換言之,C 的 I/O 和 Pascal 的不一樣。通常你隻需要檢查輸入例程的傳回值, 例如, fgets()在遇到檔案結束符的時候傳回 NULL。實際上, 在任何情況下, 都完全沒有必要使用 feof()

有時候,正是那些意想不到之人,成就了無人能成之事。