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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 10:33:04