初學 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", ...) 中:
%f 讀取浮點數,留下緩衲區中的空格/換行%d 讀取整數,同樣留下分隔符%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)