C语言字符串数字频率统计代码大输入异常问题排查
问题分析与修复
嘿,我一眼就瞅出你代码里的问题了——是数组下标越界搞的鬼,这也是大输入时结果乱掉的根本原因!
错误点拆解
你定义的统计数组int arr[10];只有10个元素,合法的下标范围是0到9(刚好对应数字0-9的统计位置)。但你在初始化和统计的时候,居然用了字符的ASCII值(48到57,也就是字符'0'到'9'的ASCII码)当数组下标:
// 初始化时直接越界访问arr[48]到arr[57],这根本不在数组范围内! for(int i=48;i<=57;i++){ arr[i]=0; } // 统计时同样越界,把数字字符的ASCII值直接当下标用 arr[a[j]]++;
这种操作会直接踩进数组arr之外的内存区域,破坏其他变量的存储(比如strlen(a)的计算结果、循环变量j的值等等)。小输入时可能碰巧没碰坏关键数据,大输入时内存冲突就彻底爆发了,输出自然全乱。
修复后的代码
只需要把字符转成对应的数字下标就行——用字符减去'0',就能把'0'-'9'转换成0-9的合法下标,完美匹配数组的范围。修正后的代码如下:
#include <stdio.h> #include <string.h> int main() { char a[1001]; scanf("%s",a); int arr[10]; // 用0-9的合法下标初始化统计数组 for(int i=0;i<10;i++){ arr[i]=0; } int j=0; int len = strlen(a); // 提前存字符串长度,避免每次循环都计算 while(j<len){ if(a[j]>='0' && a[j]<='9'){ // 把字符转成对应数字下标:a[j] - '0' arr[a[j] - '0']++; } j++; } // 遍历0-9下标输出统计结果 for(int i=0;i<10;i++){ printf("%d ",arr[i]); } return 0; }
额外小优化
我还加了个小细节:提前把字符串长度存在len里,避免每次while循环都调用strlen(a)(这个函数每次都会遍历整个字符串,大输入下会拖慢效率)。另外别忘了包含string.h头文件,不然strlen可能会有未定义行为哦。
内容的提问来源于stack exchange,提问作者Kon




