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

C 語言 scanf 讀取字符吃掉換行符:連續兩次 scanf("%c") 解決緩衝區殘留

     編輯:程式設計綜合問答

問題現象

第一個獨立程序正常讀取字符並判斷字母/ASCII。第二個程序先讀 int,後讀 char,直接跳過字符輸入,打印結果異常。

根因

scanf("%d", &a) 讀取整數後,**換行符 '\n' 殘留在輸入緩衝區**。緊接的 scanf("%c", &c) 直接讀走這個 '\n',導致實際字符輸入被下一個 scanf 讀取,邏輯亂套。

解決方案

方法一:連續兩次 %c(治標)

scanf("%c", &c); // 吃掉殘留 \n
scanf("%c", &c); // 讀取真正字符

方法二:格式串加空格吃白字符(推薦)

scanf(" %c", &c); // %c 前加空格,自動跳過所有空白字符(\n, \t, 空格)

方法三:用 fgets 讀整行再 sscanf(最穩健)

char buf[32];
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%c", &c);

完整修正代碼片段

// ... 讀 int a 後
printf("請輸入一個字符:\n");
scanf(" %c", &c); // 關鍵:%c 前加空格
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
    printf("輸入的字符%c是字母\n", c);
else
    printf("輸入的字符%c不是字母\n", c);
int d = c;
printf("字符%c的ASCII碼是%d\n", c, d);

舉一反三

  • scanf("%d") 後接 scanf("%c")、scanf("%s")、gets()、fgets() 皆會遇到此問題。
  • 習慣:所有 %c 格式串前加空格,或統一用 fgets + sscanf 避開掃描器緩衝區陷阱。

總結

scanf 不會自動消耗換行符,**%c 直接讀取下一字符(含 \n)**。**scanf(" %c", &c) 加空格是最簡潔標準的修復**,新手必記。

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