首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 經典誤區:用 char 接收 getchar/fgetc 返回值

     編輯:關於C++

為什麼 char c = getchar(); 是危險的錯誤

無數初學者(甚至部分教材)習慣用 char 變數接收 getchar()、fgetc() 等函式的返回值,這看似合理實則隱藏嚴重 Bug,可能導致程式陷入無窮迴圈或提前結束讀取。

根本原因:返回類型與 EOF 表示

  • getchar()/fgetc() 返回類型為 int
  • 讀取錯誤或檔案結束時返回 EOF(標準規定為負數 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 使用
}

C++ cin.get() 同理

// 錯誤
char c = cin.get();

// 正確:用 int 接收返回值
int c = cin.get();

// 正確:用 char 參數版本
char c;
cin.get(c);  // 此版本不返回字元,而是透過參數傳回

核心原則

凡是可能返回 EOF 的輸入函式,接收變數必須宣告為 int;確認非 EOF 後,再轉型為 char 使用。

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