C语言统计数字频率时isdigit判断>0与>=0的差异问题
isdigit(s[i]) > 0与isdigit(s[i]) >= 0的差异说明 1. C标准isdigit函数的返回规则
isdigit是<ctype.h>头文件提供的字符判断函数,入参要求为unsigned char转换后的值或EOF,返回值规则固定:
- 若输入字符是十进制数字(
'0'~'9'),返回非零正整数 - 若输入字符不是十进制数字,返回固定值0
2. 两个判断条件的核心差异
isdigit(s[i]) >= 0:永远为真。因为isdigit的返回值只有0和正整数两种可能,全部满足大于等于0的要求,相当于完全没有做数字校验,所有字符(包括字母、符号、字符串结束符\0)都会进入分支执行。非数字字符减'0'后得到的下标不在0~9范围内,会直接引发数组越界访问,属于未定义行为,最终num1的统计结果完全错误。isdigit(s[i]) > 0:符合数字校验的预期逻辑。只有当字符确实是数字时,isdigit返回的正整数才会满足大于0的条件,才会进入分支统计频率,逻辑是正确的。
3. 示例代码存在的其他问题
你提供的代码还有两处明显错误,会导致结果不符合预期:
num2数组未初始化:局部数组未手动初始化时存储的是栈上的随机垃圾值,你输出的num2结果并不是完全准确的预期值,正确写法应该是int num1[10] = {0}, num2[10] = {0};- 循环边界错误:
for (int i = 0; i <= len; i++)会遍历到字符串末尾的结束符\0,多余的遍历也会增加越界风险,正确边界应为i < len。
内容的提问来源于stack exchange,提问作者indranil majee
相关产品推荐
相关产品推荐

