C语言统计正整数最大数位右起位置出现次数的程序故障排查
C代码问题排查及修复
存在的问题
1. 数位位置计算逻辑错误
这是核心问题:现有代码没有独立维护当前遍历到的数位的位置索引,而是将结果位置的递增和「是否找到更大数位」绑定,导致无法正确获取当前数位的真实位置,最终统计错误。
举个错误例子:测试用例中的15926,各位从右到左依次为6(位置0)、2(位置1)、9(位置2)、5(位置3)、1(位置4),最大数位9在右2位置。现有代码执行时:
- 处理位置0的6:大于初始max=0,pos变为1
- 处理位置1的2:小于max=6,pos不变
- 处理位置2的9:大于max=6,pos变为2
- 后续数位都小于9,pos不变
最终pos=2,会被switch语句错误映射到位置1的计数,和实际的位置2不符。
2. 输入循环判断逻辑错误
while (scanf("%d",&n))的判断存在漏洞:scanf读取失败时会返回0(匹配到非数值)或EOF(输入结束),其中EOF是值为-1的常量,属于非0值,会导致遇到输入结束时循环不会正常退出,触发未定义行为。
修复方案
- 新增独立的
cur_pos变量记录当前遍历的数位位置,每处理一位就递增,只有找到更大的数位时才更新结果位置res_pos - 修改循环条件为
while (scanf("%d", &n) == 1),只有成功读取到1个整数时才继续循环 - 调整switch映射逻辑和结果位置直接对应,避免偏移错误
修复后代码
#include <stdio.h> int main(){ int n; int br0=0, br1=0, br2=0, br3=0, br4=0; // 只有成功读取1个整数时才继续循环 while (scanf("%d",&n) == 1) { int max = 0; int num = n; int cur_pos = 0; // 记录当前遍历到的数位位置 int res_pos = 0; // 记录最大数位的最终位置 while (num > 0) { int digit = num % 10; if (digit > max) { max = digit; res_pos = cur_pos; // 直接赋值当前真实位置 } num /= 10; cur_pos++; // 每处理一位,位置自增 } // 按实际位置统计计数 switch (res_pos) { case 0: br0++; break; case 1: br1++; break; case 2: br2++; break; case 3: br3++; break; case 4: br4++; break; } } printf("0: %d\n1: %d\n2: %d\n3: %d\n4: %d\n", br0, br1, br2, br3, br4); return 0; }
内容的提问来源于stack exchange,提问作者itmemilan
相关产品推荐
相关产品推荐

