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

C 語言 scanf 與 printf:為何輸入後無法正確讀取字符?

     編輯:程式設計綜合問答

現象重現

代碼如下:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int a;
    char ch;
    scanf_s("%d", &a);
    printf("a=%d\n", a);
    scanf_s("%c", &ch);  // 這裡未能讀取到預期的字符
    printf("ch=%c\n", ch);
    system("pause");
    return 0;
}

輸入 1a 後,a 正確輸出 1,但 ch 卻沒有讀到 a。

根本原因

scanf_s("%d", &a) 讀取整數 1 後,緩衝區仍殘留換行符 \n(或輸入的 a 之後的換行)。隨後的 scanf_s("%c", &ch) 直接讀取了這個換行符,導致 ch 成為 \n,顯示為空行。

解決方法

方法一:在格式字符串前加空格

scanf_s(" %c", &ch);  // %c 前的空格會跳過所有空白字符(含 \n、空格、\t)

方法二:顯式消耗換行符

getchar();  // 讀走殘留的 \n
scanf_s("%c", &ch);

方法三:改用 fgets + sscanf

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

最佳實踐建議

  • 習慣在 %c、%[、% 等不跳過空白的格式前加空格。
  • 混合讀取數字與字符時,推薦整行讀取再解析,避免緩衝區殘留問題。
  • VS 中 scanf_s 需要緩衝區大小參數,讀字符串時必須傳入長度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved