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

C 語言 `if (ch != '\032' && ch != '\r')` 判斷邏輯解析:EOF 與換行符的處理

     編輯:程式設計綜合問答

程式碼片段

if (ch != '\032' && ch != '\r') { ... }

字元含義

  • '\032':八進位 32 = 十進位 26 = 0x1A = Ctrl+Z,在 Windows/DOS 文字模式下代表 EOF (End of File)。
  • '\r':Carriage Return (CR),ASCII 13,Windows 換行序列 \r\n 的第一個字元。

判斷目的

讀取文字檔時,過濾掉 EOF 標記與 CR 字元,避免它們進入後續邏輯(如字元計數、字串組裝)。

為何覺得「有沒有一樣」?

  1. 測試資料太簡單:輸入未包含 Ctrl+Z 或單獨 \r(如 Unix 檔案僅 \n),條件永真,行為無差異。
  2. 編譯器/執行環境差異:現代 IDE 控制台輸入通常不送 Ctrl+Z;檔案若以二進位模式開啟 ("rb") 則不會自動轉換 \r\n。

正確處理建議

// 讀取文字檔,標準 C 方式
FILE* fp = fopen("test.txt", "r"); // 文字模式,自動處理 \r\n -> \n
int ch;
while ((ch = fgetc(fp)) != EOF) { // EOF 是 -1,非字元 '\032'
    if (ch != '\r') { /* 處理 */ }
}
fclose(fp);
  • 使用 fgetc 回傳 int,直接比對巨集 EOF(通常為 -1),勿自行比對 '\032'。
  • 文字模式下 C 執行期庫已將 \r\n 轉為 \n,通常不需手動濾 \r;若跨平台讀取舊版 Mac (\r) 或 Windows (\r\n) 檔案,可保留濾除邏輯。

測試驗證方法

建立含 Ctrl+Z 與單獨 \r 的測試檔:

echo -ne "abc\rdef\x1Aghi" > test.txt

執行原程式觀察輸出差異。

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