初學 getchar() 時常見困惑:輸入單字元 'A' 按 Enter,緩衝區為何會有兩個字元 ('A' 和 '\n')?getchar() 每次只取一個,換行符去哪了?本文從標準輸入緩衝區機制徹底解釋。
char c1 = getchar(); // 輸入 A + Enter
putchar(c1); // 輸出 A
char c2 = getchar(); // 直接讀到 '\n',無需再按鍵
putchar(c2); // 輸出換行
A\n 兩個字元。'A' (0x41) 和 '\n' (0x0A) 放入 stdin 緩衝區。getchar() 讀取第一個字元 'A',緩衝區剩 '\n'。putchar('A') 輸出 A。getchar() 發現緩衝區有 '\n',**直接讀取並返回**,不等待鍵盤。putchar('\n') 輸出換行。「按 Enter 只是確認結束,不會產生字元」——錯誤。Enter 產生
'\n'(LF, 0x0A),它**就是一個合法字元**,佔據緩衝區一個位置。
getchar(); // 讀取並丟棄 '\n'scanf(" %c", &c); (格式字串前加空格) 自動跳過 '\n', ' ', '\t'。while ((c = getchar()) != '\n' && c != EOF);setvbuf(stdin, NULL, _IONBF, 0); 使每字元即時送達 (互動式程式慎用)。
鍵盤輸入 "A" + Enter
│
▼
┌───────────────────┐
│ stdin 緩衝區 │ ◄── 核心/ libc 維護
│ ['A', '\n'] │
└───────────────────┘
│
▼ getchar() 取 'A'
┌───────────────────┐
│ ['\n'] │ ◄── 換行符留在這裡!
└───────────────────┘
│
▼ getchar() 取 '\n'
┌───────────────────┐
│ [] (空) │
└───────────────────┘
理解「輸入行緩衝、逐字元取出」模型,即可輕鬆駕馭 getchar/scanf 等輸入函式的行為。