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

C语言输入验证问题:如何限制输入1/2/3并过滤非法内容

解决C语言输入校验与缓冲区问题的实现方案

直接上能满足你需求的代码:

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

int main() {
    int choice;
    char input[100];
    char *endptr;

    while (1) {
        printf("请输入1、2或3:");
        // 读取整行输入,避免部分读取的问题
        if (fgets(input, sizeof(input), stdin) == NULL) {
            printf("输入错误,程序退出\n");
            return 1;
        }

        // 去掉换行符(如果存在)
        size_t len = strlen(input);
        if (len > 0 && input[len-1] == '\n') {
            input[len-1] = '\0';
        } else {
            // 输入超长时清空缓冲区剩余内容
            int c;
            while ((c = getchar()) != '\n' && c != EOF);
        }

        // 检查空输入
        if (strlen(input) == 0) {
            printf("输入不能为空,请重新输入\n");
            continue;
        }

        // 解析数字并校验是否存在非数字字符
        choice = strtol(input, &endptr, 10);
        // endptr指向第一个无法解析的字符,若不是字符串末尾则说明有非法字符
        if (*endptr != '\0') {
            printf("输入包含非法字符,请输入纯数字1、2或3\n");
            continue;
        }

        // 校验数字范围
        if (choice < 1 || choice > 3) {
            printf("输入数字不在1-3范围内,请重新输入\n");
            continue;
        }

        // 输入正确,退出循环
        break;
    }

    printf("你选择了:%d\n", choice);
    // 后续业务逻辑...
    return 0;
}

关键逻辑说明:

  • 用fgets读取整行:彻底解决scanf("%d")只截取数字部分的问题,能完整捕获“1gf”这类带后缀的输入,从根源避免缓冲区残留问题。
  • 处理换行与超长输入:自动去除输入末尾的换行符,若输入长度超过缓冲区,会清空剩余的缓冲区内容,防止影响下一次输入。
  • strtol解析+非法字符校验:strtol负责转换合法数字,endptr会定位到第一个无法解析的字符,只要它不是字符串末尾,就判定输入包含非法内容。
  • 循环校验直至输入合法:空输入、非数字、数字超出范围的情况都会触发错误提示,强制用户重新输入,直到符合要求为止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:45:31