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

C 語言 scanf 與 getchar 差異深度解析:緩衝區、換行符與輸入陷阱

     編輯:關於C語言

核心差異速查表

特性scanfgetchar
功能定位格式化輸入單字元讀取
空白處理自動跳過空格、Tab、換行不跳過,逐字讀取含換行符
返回值成功匹配項數 / EOF字元值 (int) / EOF
典型用途讀取數值、字串、格式化資料讀取單鍵、清理緩衝區、互動式選單

經典陷阱:連續 scanf("%c") 吞掉換行符

char a, b, c;
scanf("%c", &a);  // 輸入 'q' + Enter
scanf("%c", &b);  // 直接讀到 '\n',不等待輸入!
scanf("%c", &c);  // 讀到 'w' + Enter → c='w'

原因:%c **不跳過空白**,上一個 Enter 留在緩衝區,下一個 %c 直接讀走。

解決方案對比

方法一:scanf(" %c", &c) (格式字串前加空格)

scanf(" %c", &a);  // 空格指示:跳過任意數量空白字元
scanf(" %c", &b);
scanf(" %c", &c);

最簡潔、標準做法。

方法二:getchar() 吸收換行符

scanf("%c", &a);
getchar();  // 讀走殘留的 '\n'
scanf("%c", &b);
getchar();
scanf("%c", &c);

教學常見,但較繁瑣,若輸入行有多餘空格會殘留。

方法三:改用 fgets + sscanf (最健壯)

char line[100];
fgets(line, sizeof(line), stdin);
sscanf(line, "%c %c %c", &a, &b, &c);

整行讀取,完全掌控解析邏輯,避免緩衝區殘留問題。

getchar 進階妙用

1. 清空輸入緩衝區

while (getchar() != '\n');  // 讀到換行符為止

2. 暫停程式「按任意鍵繼續」

printf("Press Enter to continue...");
getchar();

3. 逐字元處理輸入流

int c;
while ((c = getchar()) != EOF) {
    if (c >= 'a' && c <= 'z') putchar(c - 32);  // 小寫轉大寫
    else putchar(c);
}

緩衝區運作示意

輸入 x\n 時:

  1. 字元進鍵盤硬體緩衝區 → 系統標準輸入緩衝區 (stdin)。
  2. 呼叫 getchar():若緩衝區非空,直接取出首字元;若為空,阻塞等待。
  3. Enter 產生 \n,**也是字元**,一併進緩衝區。
  4. 第一次 getchar() 取走 x,\n 留在緩衝區。
  5. 第二次 getchar() 立即取走 \n,**不會等待新輸入**。

總結

  • scanf 讀數值:自動跳過空白,極少出問題。
  • scanf 讀字元:**務必加空格** " %c" 或改用 fgets。
  • getchar:逐字元讀取,含換行符,適合清理緩衝區、簡單互動。
  • 混用 scanf/getchar:極易產生緩衝區殘留問題,建議統一用 fgets + sscanf 徹底解決。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved