輸入 `s` 或 `t` 後提示「輸入下一個字母」,但 `scanf_s("%c", &ch)` 直接讀到換行符,導致程序直接退出,無顯示結果。
#include
int main(void) {
puts("請輸入星期首字母 (m/t/w/f/s):");
int ch = getchar(); // 讀首字母
while (getchar() != '\n'); // 清空緩衝區剩餘字符(含換行)
switch (ch) {
case 'm': puts("Monday"); break;
case 't':
puts("請輸入第二字母 (u/h):");
ch = getchar();
while (getchar() != '\n'); // 清理
if (ch == 'u') puts("Tuesday");
else if (ch == 'h') puts("Thursday");
break;
case 'w': puts("Wednesday"); break;
case 'f': puts("Friday"); break;
case 's':
puts("請輸入第二字母 (a/u):");
ch = getchar();
while (getchar() != '\n');
if (ch == 'a') puts("Saturday");
else if (ch == 'u') puts("Sunday");
break;
default: puts("輸入錯誤");
}
return 0;
}
scanf(" %c", &ch); // %c 前加空格:自動跳過 \n, space, \t 等空白字符
char buf[10];
fgets(buf, sizeof(buf), stdin); // 讀整行含換行
sscanf(buf, " %c", &ch); // 解析首非空白字符
| 函數 | 行為 | 避坑技巧 |
|---|---|---|
| `getchar()` | 讀單字符,含換行 | 後跟 `while(getchar()!='\n');` 清理 |
| `scanf("%c")` | 讀單字符,**不跳過空白** | 用 `" %c"` (前加空格) 跳過空白 |
| `scanf("%d/%s")` | **自動跳過空白** | 無需額外處理 |
| `fgets()` | 讀整行(含換行) | 最安全,配合 sscanf 解析 |
#include
#include
int main() {
char input[10];
while (1) {
printf("輸入星期首字母 (m/t/w/f/s, q退出): ");
if (!fgets(input, sizeof(input), stdin)) break;
if (input[0] == 'q' || input[0] == 'Q') break;
char first = tolower(input[0]);
switch (first) {
case 'm': puts("Monday"); break;
case 't':
printf("輸入第二字母 (u/h): ");
fgets(input, sizeof(input), stdin);
if (tolower(input[0]) == 'u') puts("Tuesday");
else if (tolower(input[0]) == 'h') puts("Thursday");
else puts("錯誤");
break;
case 'w': puts("Wednesday"); break;
case 'f': puts("Friday"); break;
case 's':
printf("輸入第二字母 (a/u): ");
fgets(input, sizeof(input), stdin);
if (tolower(input[0]) == 'a') puts("Saturday");
else if (tolower(input[0]) == 'u') puts("Sunday");
else puts("錯誤");
break;
default: puts("無效輸入");
}
}
return 0;
}
`scanf("%c")` **不跳過換行符** 是 C 輸入經典大坑。統一使用 `fgets` 讀行 + `sscanf` 解析,或 `getchar` 配合清理緩衝區,可徹底避免此類問題。`scanf_s` 為 MSVC 專有,移植性較差,建議項目中統一標準 C 輸入方式。