C90整数集合程序While循环判断条件恒成立bug排查求助
输入判断条件误触发非法输入的排查与修复
问题根源
类型不匹配导致EOF判断失效
EOF是int类型的常量(通常定义为-1),如果代码里用char类型变量存储getchar()的返回值,会发生截断:若char为无符号类型,EOF的-1会被转换为255,此时*input != EOF的判断永远为真;即使是有符号char,类型提升规则也会让和EOF的比较结果不符合预期,导致非法输入的判断逻辑被错误触发。未正确初始化/读取输入
如果循环中先执行判断逻辑,再读取输入,首次判断时*input是未初始化的垃圾值,大概率会满足非法输入的条件,直接触发程序退出。指针指向无效内存(若使用指针)
若input是指针但未指向有效初始化的变量,*input会是随机值,同样会导致条件持续成立。
修复方案
1. 修正变量类型与读取顺序
- 用
int类型存储getchar()的返回值,完全匹配返回值类型,避免EOF判断失效。 - 先读取输入,再执行判断逻辑,确保判断的是有效输入值。
示例代码片段(兼容C90):
#include <stdio.h> #include <stdlib.h> void set_get() { int ch; // 用int存储输入字符,兼容EOF // 先读取输入再执行判断 while ((ch = getchar()) != EOF) { // 判断非法字符:不是数字、空格、负号、换行 if ((ch < '0' || ch > '9') && ch != ' ' && ch != '-' && ch != '\n') { fprintf(stderr, "非法输入,程序退出\n"); exit(EXIT_FAILURE); } // 后续处理:提取整数、去重逻辑... } }
2. 简化判断逻辑
把EOF的判断移到循环条件中,循环内部无需再判断EOF,减少冗余:
原条件中的*input != EOF可以直接删除,因为循环会在读取到EOF时自动终止。
3. 确保指针指向有效内存(若使用指针)
如果必须用指针,要让它指向一个已初始化的int变量,并且每次循环更新该变量的值:
void set_get() { int current_ch; int *input = ¤t_ch; // 指针指向有效内存 while ((*input = getchar()) != EOF) { if (((*input < '0' || *input > '9') && *input != ' ' && *input != '-' && *input != '\n')) { fprintf(stderr, "非法输入,程序退出\n"); exit(EXIT_FAILURE); } // 后续处理... } }
额外优化建议
原条件允许负号出现在任何位置(比如12-3会被判定为合法),如果需要严格验证整数格式,还需要添加逻辑:仅当负号出现在数字开头(或空格之后的开头)时才允许,避免无效的负号输入。
内容的提问来源于stack exchange,提问作者SosoMath_TryingMyBest.
相关产品推荐
相关产品推荐

