You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现9位数字char变量输入的循环校验需求

解决C语言中9位数字输入的循环验证与缓冲区溢出问题

修正后的完整代码

#define _CRT_SECURE_NO_WARNINGS

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

int main()
{
    // 数组大小设为10:9位数字 + 字符串结束符'\0'
    char NIN[10];
    int valid;

    do {
        valid = 1; // 默认输入有效
        printf("Please enter your 9 digit NIN:\t");
        // 限制最多读取9个字符,防止缓冲区溢出
        scanf("%9s", NIN);

        // 检查输入长度是否为9
        if (strlen(NIN) != 9) {
            printf("Error: Input must be exactly 9 digits.\n");
            valid = 0;
            // 清空输入缓冲区的残留字符,避免影响下一次输入
            while (getchar() != '\n');
            continue;
        }

        // 检查每个字符是否都是数字
        for (int i = 0; i < 9; i++) {
            if (!isdigit(NIN[i])) {
                printf("Error: Input must contain only digits.\n");
                valid = 0;
                // 清空输入缓冲区
                while (getchar() != '\n');
                break;
            }
        }

    } while (!valid); // 输入无效时循环

    printf("Your valid 9-digit NIN is: %s\n", NIN);
    return 0;
}

关键改动说明

  • 数组大小调整:原代码中char NIN[9]无法容纳9位数字(因为C字符串需要末尾的'\0'作为结束标记),改成char NIN[10]才能正确存储9位数字加结束符。
  • 安全输入限制:使用scanf("%9s", NIN),强制限制最多读取9个字符,彻底避免缓冲区溢出问题。
  • 循环验证逻辑:用do-while循环实现“先输入,再验证,无效则重复”的流程,逻辑直观易理解。
  • 长度校验:通过strlen(NIN)获取输入字符串长度,判断是否等于9。
  • 数字校验:遍历每个字符,用isdigit()函数检查是否为数字,确保输入全是数字字符。
  • 缓冲区清空:当输入无效(过长或包含非数字)时,用while(getchar() != '\n')清空输入缓冲区里的残留字符,防止这些残留被下一次scanf读取,导致循环异常。

内容的提问来源于stack exchange,提问作者tyna 007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:50:16