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

C 語言 scanf 輸入緩衝區導致字符讀取失敗的解決方法

     編輯:程式設計綜合問答

初學 C 語言時,使用 scanf 連續讀取浮點數、整數和字符,常會遇到「字符變量讀取到空格或換行符」的問題。本文分析原因並給出修正方案。

問題代碼

void main() {
    int b;
    float a;
    char c;
    scanf("%f%d%c", &a, &b, &c);
    // 後續判斷邏輯...
}

輸入示例:50 90 m(空格分隔),結果 c 讀取到的是空格而非 'm',導致後續邏輯判斷失敗。

原因分析

scanf("%f%d%c", ...) 中:

  1. %f 讀取浮點數,留下緩衲區中的空格/換行
  2. %d 讀取整數,同樣留下分隔符
  3. %c 不會跳過空白字符,直接讀取緩衝區中的下一個字符(通常是空格或換行符)

解決方案

方法一:在 %c 前加空格(推薦)

scanf("%f%d %c", &a, &b, &c);  // %c 前加一個空格,跳過所有空白字符

%c 前的空格會讓 scanf 忽略任意數量的空白字符(空格、制表符、換行符),直接讀取下一個可見字符。

方法二:使用分隔符

scanf("%f,%d,%c", &a, &b, &c);  // 輸入格式:50,90,m

強制用戶按逗號分隔輸入,避免空白字符干擾,但降低了用戶友好性。

方法三:清空緩衝區

scanf("%f%d", &a, &b);
while(getchar() != '\n');  // 清空緩衝區殘留字符
scanf("%c", &c);

適用於較複雜的輸入場景,但代碼較繁瑣。

業務邏輯補充

題目中服務類型:m 代表自助服務(95 折),e 代表協助服務(97 折),原代碼誤寫為 b,需修正。

修正後完整代碼

#include <stdio.h>

int main() {
    int b;
    float a;
    char c;
    
    printf("請輸入加油量、汽油品種(90/93/97)、服務類型(m/e):");
    scanf("%f%d %c", &a, &b, &c);  // 關鍵修正:%c 前加空格
    
    double price = 0;
    switch(b) {
        case 90: price = 6.95; break;
        case 93: price = 7.44; break;
        case 97: price = 7.93; break;
        default: printf("汽油品種錯誤\n"); return 1;
    }
    
    double discount = (c == 'm') ? 0.95 : (c == 'e' ? 0.97 : 1.0);
    if (discount == 1.0) { printf("服務類型錯誤\n"); return 1; }
    
    printf("應付款:%.2f\n", a * price * discount);
    return 0;
}

最佳實踐建議

  • 掃描字符前務必加空格:scanf(" %c", &ch)
  • 檢查 scanf 返回值,確保輸入項數匹配
  • 考慮使用 fgets + sscanf 替代 scanf,更安全可控
  • 主函數返回 int,規範寫法:int main(void)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved