首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 EOF 判斷機制:同行輸入 EOF 無效、獨立行才生效的標準輸入緩衝區行緩衝特性

     編輯:程式設計綜合問答

程式碼與現象

int i;
for (i = 0; getchar() != EOF; i++);
printf("There are %d chars", i);
  • 輸入 abc + Enter → 計數 4 (含換行)。
  • 輸入 abc + Ctrl+D (Linux/Mac) 或 Ctrl+Z (Windows) → 計數 3,**但需獨立一行或行首輸入**才能觸發 EOF。
  • 若輸入 abc^D (同行) → 視為普通字元,不觸發 EOF。

根本原因:標準輸入預設「行緩衝」

  1. 終端機驅動程式收集鍵盤輸入,放入內核緩衝區。
  2. 只有按下 Enter (換行符 \n),**整行**才會提交給進程 stdin。
  3. Ctrl+D (Unix) / Ctrl+Z (Windows) 代表「檔案結束」,**僅在緩衝區為空 (行首) 時**才立即送 EOF 給進程;若緩衝區已有字元,則先提交該行內容,下一次讀取才回傳 EOF。

驗證實驗

// 測試程式
int c, cnt = 0;
while ((c = getchar()) != EOF) {
    printf("Read: %c (0x%02X)\n", isprint(c)?c:'.', c);
    cnt++;
}
printf("Total: %d\n", cnt);
  • 輸入 hello^D (同行) → 輸出 Read: h... Read: o,**無 EOF**,程式繼續等待。
  • 再按 Enter → 提交 hello,程式印出 Total: 5 並繼續等待。
  • 新行按 Ctrl+D → 緩衝區空,直接送 EOF,迴圈結束。

跨平台差異

平台EOF 觸發鍵行緩衝預設
Linux / macOSCtrl+D是
Windows (cmd)Ctrl+Z 後按 Enter是
Windows (Git Bash / WSL)Ctrl+D是

最佳實踐

  • 教學/測試程式:預期使用者「輸入一行、按 Enter、再按 EOF 鍵」結束。
  • 正式程式:改用具體結束條件 (如讀取特定字串 "quit"、固定筆數、檔案重導向 ./prog < input.txt)。
  • 檔案重導向時,EOF 由檔案結束自然觸發,無上述互動問題。

理解「終端機行緩衝 + EOF 只在行首生效」的機制,才能正確設計與測試基於 getchar() 的互動式輸入程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved