驗證碼錯誤 3 次後,倒數 10 秒(for(countdown=10; countdown>0; countdown--)),每秒 system("cls") 清屏並 printf("%d", countdown)。倒數結束後,用戶輸入正確驗證碼卻仍判定錯誤。
倒數迴圈最後一次執行時:
countdown=1,system("cls") 清屏。printf("%d", 1) 輸出 1 並**留在緩衝區/螢幕上**(無換行符)。scanf("%d", &number) 等待輸入。1,用戶輸入正確數字(如 123),實際輸入緩衝區變為 1123(殘留的 1 + 用戶輸入),scanf 讀取整數 1123,與驗證碼不符 → 判定錯誤。for (countdown = 10; countdown > 0; countdown--) {
system("cls");
printf("%d", countdown);
fflush(stdout); // 強制刷新輸出緩衝區,確保立即顯示
Sleep(1000);
}
system("cls"); // 倒數結束後**再清一次屏**,清除殘留的 '1'
system("cls") 與 Sleep 的可移植性/效能問題#ifdef _WIN32
#include <windows.h>
#define CLEAR_SCREEN() system("cls")
#define SLEEP_MS(ms) Sleep(ms)
#else
#include <unistd.h>
#define CLEAR_SCREEN() printf("\033[H\033[2J") // ANSI 轉義序列清屏
#define SLEEP_MS(ms) usleep((ms)*1000)
#endif
for (int cd = 10; cd > 0; --cd) {
CLEAR_SCREEN();
printf("請等待 %d 秒...\n", cd);
fflush(stdout);
SLEEP_MS(1000);
}
CLEAR_SCREEN(); // 關鍵:清除最後殘留輸出
scanf 會讀取殘留字元 + 用戶新輸入。fflush(stdout),確保用戶看到最新狀態。system() 呼叫外部命令(安全風險、效能差、跨平台麻煩),改用 ANSI 轉義序列或平台 API。總結: Bug 非邏輯錯誤,而是**控制台輸出殘留干擾輸入**。加上倒數結束後的 system("cls") / CLEAR_SCREEN() 即可徹底修復。