初學者常遇到一個問題:使用 scanf("%d", &a) 讀取整數時,若用戶輸入字母或符號,程序會陷入死循環或崩潰。核心解決方法是檢查 scanf 的返回值。
scanf 返回成功匹配並賦值的輸入項數。若格式字符串中有一個 %d,則:
1:成功讀入一個整數0:輸入不匹配(如輸入字母),目標變量不變,錯誤字符仍留在輸入緩衝區EOF(通常為 -1):輸入流結束(如 Ctrl+D/Ctrl+Z)或發生讀取錯誤#include <stdio.h>
#include <stdlib.h> // system("pause") 在 Windows 下常用
int main() {
int a, b, c;
int ret;
printf("輸入被除數: ");
ret = scanf("%d", &a);
if (ret != 1) {
printf("輸入錯誤:請輸入整數!\n");
// 清空輸入緩衝區,避免後續 scanf 直接讀到殘留字符
while (getchar() != '\n');
return 1;
}
printf("輸入除數: ");
ret = scanf("%d", &b);
if (ret != 1 || b == 0) {
printf("輸入錯誤:除數必須為非零整數!\n");
while (getchar() != '\n');
return 1;
}
c = a / b;
printf("計算結果: %d\n", c);
system("pause"); // Windows 控制台暫停
return 0;
}
// 返回 1 成功,0 失敗
int read_int(const char *prompt, int *out) {
int ret;
while (1) {
printf("%s", prompt);
ret = scanf("%d", out);
if (ret == 1) return 1; // 成功
if (ret == EOF) return 0; // 文件結束
// ret == 0:清理緩衝區無效字符
printf("輸入無效,請輸入整數!\n");
while (getchar() != '\n');
}
}
// 使用示例
int main() {
int x, y;
if (read_int("輸入第一個整數: ", &x) &&
read_int("輸入第二個整數: ", &y)) {
printf("和 = %d\n", x + y);
}
return 0;
}
fflush(stdin):C標準未定義其行為,僅在部分編譯器(如MSVC)有效,不可移植。正確清理緩衝區用 while(getchar()!='\n');。scanf("%lf", &d) 返回 1 表示成功讀入 double。fgets(buf, sizeof(buf), stdin) 讀整行,再用 sscanf(buf, "%d", &a) 解析,避免緩衝區殘留問題。判斷輸入是否為整數的標準方法:檢查 scanf("%d", &var) == 1。結合緩衝區清理與錯誤提示,即可編寫健壯的交互程序。這是從“能跑”走向“工程級”代碼的關鍵一步。