輸入 `a b c` 後按回車,程序進入 `do-while` 循環,**未等待用戶輸入 Y/N 直接跳出/繼續**,`choice` 變成換行符 `\n`。
scanf("%lf%lf%lf", &a, &b, &c) 讀取三個 double 後,**緩存區殘留換行符 `\n`**。隨後 choice = getchar() 直接讀取該殘留 `\n`,而非用戶新輸入的字符。
scanf("%lf%lf%lf", &a, &b, &c);
getchar(); // 關鍵:吞掉殘留的換行符
do {
// ... 計算 ...
printf("是否繼續(Y/N):");
choice = getchar(); // 此時讀取用戶真正輸入的字符
// 若用戶輸入 "Y\n",choice='Y',緩存仍留 '\n',下輪循環需再補一個 getchar()
// 更穩健:用 scanf(" %c", &choice) 格式串前加空格,自動跳過空白字符
} while (choice == 'Y' || choice == 'y');
| 場景 | 推薦寫法 |
|---|---|
| scanf 後接 getchar/gets | scanf("%d", &x); getchar(); // 或 scanf(" %c", &c) |
| 循環中重複讀取字符 | while ((c = getchar()) != '\n' && c != EOF); // 清空整行 |
| 混合 scanf/fgets | 統一用 fgets(buf, sizeof(buf), stdin) + sscanf,避免緩存混亂 |
**口訣:`scanf` 後若接字符讀取,必加 `getchar()` 或格式串前置空格 `scanf(" %c")`。**