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
相关产品推荐
相关产品推荐

