getchar() 殘留換行符導致、解決方案與最佳實踐程式輸入資料、計算、輸出結果後,主控台視窗**瞬間閃過**,來不及看結果。
scanf("%f%f", &a, &b) 讀取數字後,**換行符 \n 留在標準輸入緩衝區**。getchar() 直接讀走這個殘留 \n,不等使用者按鍵,程式結束,視窗關閉。getchar() (最簡單)
printf("結果: %.2f\n", a*b);
getchar(); // 吃掉殘留 \n
getchar(); // 真正等待使用者按鍵
return 0;
getchar() (較穩健)
int ch;
while ((ch = getchar()) != '\n' && ch != EOF); // 清空緩衝區至換行或 EOF
getchar(); // 等待按鍵
system("pause") (僅 Windows、不攜帶)
#ifdef _WIN32
system("pause");
#else
printf("Press Enter to continue...");
getchar();
#endif
launch.json 加 "console": "integratedTerminal",或 Code Runner 設定 "code-runner.runInTerminal": true。gcc main.c -o main && ./main (Linux/macOS) / main.exe (Windows cmd/PowerShell) — 視窗不會自動關閉。
#include
int main(void) {
float a, b;
printf("輸入長方形的長、寬:");
if (scanf("%f %f", &a, &b) != 2) return 1;
while (a <= 0 || b <= 0) {
printf("錯誤!重新輸入:");
while (getchar() != '\n'); // 清空錯誤輸入行
if (scanf("%f %f", &a, &b) != 2) return 1;
}
printf("面積 = %.2f\n", a * b);
// 方案 2:清空緩衝區再等待
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
printf("按 Enter 鍵結束...");
getchar();
return 0;
}
fflush(stdin) **未定義行為 (C 標準不支援)**,僅 MSVC 擴充支援,**嚴禁使用**。scanf 返回值**必須檢查**,輸入非數字時不會消耗緩衝區,導致無限迴圈。