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

C 語言輸入驗證:僅接受 1-100 整數,拒絕非法輸入

     編輯:程式設計疑難解答

需求

編寫四邊形判斷程序,要求用戶輸入 4 條邊長(1-100 整數),任何非整數、超範圍、無法構成四邊形的輸入均報錯並重新輸入該輪次。

核心難點

  1. scanf("%d") 遇非數字不消費輸入,導致死循環。
  2. 需清空輸入緩衝區。
  3. 邊長組合需滿足任意三邊之和大於第四邊。

健壯輸入函數封裝

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// 讀取一行並驗證是否為 1-100 整數
int readValidInt(const char *prompt) {
    char buf[64];
    while (1) {
        printf("%s", prompt);
        if (fgets(buf, sizeof(buf), stdin) == NULL) {
            exit(1); // EOF
        }
        // 去除換行符
        buf[strcspn(buf, "\n")] = '\0';
        
        // 檢查是否全為數字
        int valid = 1;
        for (int i = 0; buf[i]; i++) {
            if (!isdigit(buf[i])) { valid = 0; break; }
        }
        if (!valid) {
            printf("錯誤:請輸入正整數!\n");
            continue;
        }
        
        int val = atoi(buf);
        if (val < 1 || val > 100) {
            printf("錯誤:請輸入 1~100 之間的整數!\n");
            continue;
        }
        return val;
    }
}

完整程序邏輯

int main() {
    int T = readValidInt("請輸入測試次數: ");
    
    for (int kase = 1; kase <= T; kase++) {
        printf("第 %d 次輸入\n", kase);
        
        // 讀取四邊
        int edges[4];
        const char *prompts[4] = {
            "請輸入 A 的邊長: ",
            "請輸入 A 的對邊長: ",
            "請輸入 A 的左鄰邊長: ",
            "請輸入 A 的右鄰邊長: "
        };
        for (int i = 0; i < 4; i++) {
            edges[i] = readValidInt(prompts[i]);
        }
        
        // 四邊形判斷邏輯
        int a=edges[0], b=edges[1], c=edges[2], d=edges[3];
        if (a+b+c <= d || b+c+d <= a || c+d+a <= b || d+a+b <= c) {
            printf("無效輸入: 不能形成四邊形\n");
        } else if (a == c && b == d) {
            if (a == b) printf("該四邊形是: 正方形\n");
            else printf("該四邊形是: 長方形\n");
        } else {
            printf("不規則四邊形\n");
        }
        printf("******************************\n");
    }
    return 0;
}

關鍵技術點

技術點作用
fgets() 替代 scanf()讀取整行,避免緩衝區殘留導致死循環
strcspn() 去換行安全移除 fgets 讀入的 \n
isdigit() 逐字符檢查確保純數字輸入,拒絕 "12a" 等
atoi() 轉換字符串轉整數,前已驗證純數字故安全

進階擴展

  • 支持負數:檢查首字符允许 '-',其餘 isdigit。
  • 支持浮點數:用 strtod 檢查 endptr 是否指向字符串末尾。
  • 封裝為通用 getInput(type, validator, errorMsg) 框架。

總結

C 語言無內置輸入驗證,「讀行 → 字符串校驗 → 轉換」 是處理用戶輸入的標準健壯模式。避免直接使用 scanf 處理交互式輸入,可消除 90% 的輸入相關 Bug。

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