int n;
int ret = scanf("%d", &n);
if (ret == 1) {
// 成功讀入一個整數
} else if (ret == 0) {
// 輸入不匹配格式 (如輸入 "abc"),緩衝區仍殘留 "abc"
} else if (ret == EOF) {
// 檔案結尾或輸入錯誤 (Ctrl+D / Ctrl+Z)
}
輸入 abc 後,scanf("%d", &n) 回傳 0,n 不變,**緩衝區仍留 "abc\n"**。下一次 scanf 仍會讀到 "abc" 陷入無限迴圈。
#include
#include
#include
#include
#include
#include
int read_int(const char *prompt, int *out) {
char line[100];
while (1) {
if (prompt) printf("%s", prompt);
if (!fgets(line, sizeof(line), stdin)) return 0; // EOF
// 移除換行
char *nl = strchr(line, '\n');
if (nl) *nl = '\0';
else { // 行太長,清空剩餘緩衝區
int c; while ((c = getchar()) != '\n' && c != EOF);
}
// 空白行重來
if (line[0] == '\0') continue;
// strtol 完整解析
char *endptr;
errno = 0;
long val = strtol(line, &endptr, 10);
// 檢查:整行皆為有效數字、無溢位
if (endptr == line || *endptr != '\0') {
printf("錯誤:請輸入純整數。\n");
continue;
}
if (errno == ERANGE || val < INT_MIN || val > INT_MAX) {
printf("錯誤:超出 int 範圍。\n");
continue;
}
*out = (int)val;
return 1; // 成功
}
}
int main() {
int n;
if (read_int("請輸入整數: ", &n))
printf("你輸入: %d\n", n);
return 0;
}
fgets 讀整行,避免緩衝區殘留。strtol 提供 endptr 指向第一個無效字元,**可精確判斷是否整行皆為數字**。errno == ERANGE 捕捉溢位(LONG_MIN/MAX)。0x) / 八進位 (0) 視基數參數而定(此處基數 10 僅十進位)。int n;
while (printf("> "), scanf("%d", &n) != 1) {
scanf("%*[^\n]"); // 丟棄至換行
getchar(); // 吃掉換行
printf("請輸入整數!\n");
}