int a, b; char c;
scanf_s("%d", &a);
scanf_s("%d", &b);
scanf_s("%d", &c); // 讀取運算符,但用了 %d 且緩衝區有換行符
// 程序直接跳過,不等待輸入
\nscanf_s("%d", &a) 讀取整數,**留下換行符 \n 在標準輸入緩衝區**。scanf_s("%d", &c) 遇到 \n 非數字,**匹配失敗立即返回**,不阻塞等待,導致「跳過輸入」。%c 讀取字符,而非 %d。int a, b; char op;
printf("請輸入第一個操作數: ");
scanf_s("%d", &a);
printf("請輸入第二個操作數: ");
scanf_s("%d", &b);
// 關鍵:消耗緩衝區殘留換行符
getchar(); // 或 scanf_s("%*c"); // * 表示讀取但不賦值
printf("請輸入您的運算符 (+ - * /): ");
scanf_s(" %c", &op, 1); // 格式串前加空格,自動跳過空白字符(含\n)
// MSVC scanf_s 讀字符需指定寬度:%c 後跟緩衝區大小 1
// 計算邏輯...
int result = (op == '+') ? a+b : (op == '-') ? a-b : (op == '*') ? a*b : a/b;
printf("結果: %d\n", result);
| 問題 | 解決 |
|---|---|
| 換行符殘留導致後續 scanf 跳過 | getchar() 或 scanf_s("%*c") 消耗一個字符 |
| 運算符用 %d 讀取 | 改用 %c,且 scanf_s("%c", &op, 1) 指定寬度 |
| scanf_s 讀字符不跳過空白 | 格式串 " %c" 前加空格,自動跳過 \n/空格/制表符 |
| 除零無保護 | 除法前判斷 b != 0 |
%c、%s、%[ 格式**必須緊跟緩衝區大小參數**:scanf_s("%c", &ch, 1)、scanf_s("%s", buf, sizeof(buf))。scanf 不需要。C 語言 scanf 系列讀取後留下換行符,導致後續字符讀取跳過。**每次讀字符前加 getchar() 清理緩衝區,格式串用 " %c" 跳過空白,scanf_s 記得加寬度參數**。