首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言判斷輸入是否為整數:scanf 回傳值、字串解析與強健輸入處理

     編輯:C 語言問答

核心原理:scanf 回傳「成功轉換並賦值的項目數」

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;
}

關鍵點解析

  1. fgets 讀整行,避免緩衝區殘留。
  2. strtol 提供 endptr 指向第一個無效字元,**可精確判斷是否整行皆為數字**。
  3. errno == ERANGE 捕捉溢位(LONG_MIN/MAX)。
  4. 支援前導空白、正負號、十六進位 (0x) / 八進位 (0) 視基數參數而定(此處基數 10 僅十進位)。

快速版(僅教學示範,生產環境用上方模板)

int n;
while (printf("> "), scanf("%d", &n) != 1) {
    scanf("%*[^\n]"); // 丟棄至換行
    getchar();        // 吃掉換行
    printf("請輸入整數!\n");
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved