char c = getchar(); 是危險的錯誤無數初學者(甚至部分教材)習慣用 char 變數接收 getchar()、fgetc() 等函式的返回值,這看似合理實則隱藏嚴重 Bug,可能導致程式陷入無窮迴圈或提前結束讀取。
getchar()/fgetc() 返回類型為 intEOF(標準規定為負數 int 常數,通常為 -1)char 通常為 8 位元,無法完整容納 int 的所有值char 為 unsigned char(編譯器預設行為不定)當讀到 EOF (-1) 時,轉為 unsigned char 變成 255 (0xFF),再提升為 int 比較時變為 255,永遠不等於 -1 → 無窮迴圈。
char 為 signed char當正常讀到字元 0xFF (255) 時,轉為 signed char 變成 -1,提升為 int 仍為 -1 → 誤判為 EOF,提前結束讀取。
int c; // 必須用 int
while ((c = fgetc(fp)) != EOF) {
putchar(c); // 此處 c 確非 EOF,可安全轉為 char 使用
}
cin.get() 同理// 錯誤
char c = cin.get();
// 正確:用 int 接收返回值
int c = cin.get();
// 正確:用 char 參數版本
char c;
cin.get(c); // 此版本不返回字元,而是透過參數傳回
凡是可能返回 EOF 的輸入函式,接收變數必須宣告為 int;確認非 EOF 後,再轉型為 char 使用。