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

C語言輸入驗證:如何判斷scanf讀取的是否為整數

     編輯:C 語言問答

C語言安全輸入實戰:利用scanf返回值判斷輸入合法性

初學者常遇到一個問題:使用 scanf("%d", &a) 讀取整數時,若用戶輸入字母或符號,程序會陷入死循環或崩潰。核心解決方法是檢查 scanf 的返回值。

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。結合緩衝區清理與錯誤提示,即可編寫健壯的交互程序。這是從“能跑”走向“工程級”代碼的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved