数字频率统计程序代码故障排查:请求分析代码失效原因
代码失效原因分析及修复方案
你的代码存在三个关键问题,导致无法正常运行:
缓冲区溢出风险
定义的字符串数组str长度为100,但调用fgets时传入的最大读取长度是1000。当输入字符串长度超过99(需留一个位置存终止符'\0'),会直接超出数组边界,破坏内存数据,引发程序崩溃或异常行为。
修复:将fgets的第二个参数改为sizeof(str)或直接写100,确保读取字符数不超过数组容量:fgets(str, sizeof(str), stdin);数组下标访问错误
sum数组的合法下标范围是0-9,对应数字0-9的统计,但你直接用字符str[i]作为下标。比如字符'0'的ASCII码是48,sum[str[i]]实际访问的是sum[48],远远超出数组合法范围,导致内存越界,统计结果完全错误。
修复:将字符转换为对应数字,只需减去字符'0'的ASCII值:sum[str[i] - '0']++;未处理换行符(可选优化)
fgets会把输入末尾的换行符\n读取到字符串中,虽然isdigit会过滤它,但会让strlen的结果多算一个字符。可以在读取后手动去掉换行符:str[strcspn(str, "\n")] = '\0';
修复后的完整代码
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { char str[100]; fgets(str, sizeof(str), stdin); // 去掉换行符 str[strcspn(str, "\n")] = '\0'; int n = strlen(str); int sum[10] = {0}; int i; for(i = 0; i < n; i++){ if(isdigit(str[i])){ sum[str[i] - '0']++; } } for(i = 0; i < 10; i++){ printf("%d ", sum[i]); } return 0; }
内容的提问来源于stack exchange,提问作者Krrish Gupta
相关产品推荐
相关产品推荐

