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

C語言scanf循環讀取字符陷阱:空循環體導致程序假死

     編輯:程式設計綜合問答

問題代碼

char ch;
while(scanf("%c", &ch), ch != '\0');

現象:程序停在輸入狀態,無任何輸出,看起來「假死」。

根本原因

  1. 逗號表達式語義:`scanf("%c", &ch), ch != '\0'` 先執行 `scanf` 讀取一個字符(含換行符、空格),再判斷 `ch != '\0'`。
  2. 循環體為空:分號 `;` 表示空語句,循環內**無任何代碼執行**(包括輸出)。
  3. 終止條件難滿足:標準輸入流中極難輸入 `\0` (ASCII 0),通常只能通過 `Ctrl+D` (Linux/Mac EOF) 或 `Ctrl+Z` (Windows EOF) 結束輸入,但 `scanf` 遇到 EOF 返回 `EOF`(-1),不會將 `ch` 置為 `\0`。

正確讀取字符直到EOF

int ch; // 必須用 int 接收 EOF
while ((ch = getchar()) != EOF) {
    putchar(ch); // 回顯或處理
}
// 或 scanf 版本
int ch;
while (scanf("%c", (char*)&ch) == 1) { // 返回值 1 表示讀取成功
    printf("讀到: %c\n", ch);
}

關鍵知識點

  • `char` 無法區分有效字符 `\0` 和 `EOF`,必須用 `int` 接收 `getchar`/`scanf` 返回值
  • `scanf("%c")` **不會跳過空白字符**(換行、空格、制表符),若需跳過用 `scanf(" %c")`(格式串前加空格)
  • 鍵盤輸入 `\0` 極其困難(需 `Ctrl+@` 或 `Ctrl+Shift+2`),不作為正常終止手段

修正後的交互式讀取示例

#include 
int main() {
    int ch;
    printf("輸入字符 (Ctrl+D 結束):\n");
    while ((ch = getchar()) != EOF) {
        if (ch == '\n') continue; // 跳過換行
        printf("讀取: '%c' (ASCII: %d)\n", ch, ch);
    }
    printf("輸入結束。\n");
    return 0;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved