C语言单词长度直方图实现出现段错误,求排查原因
问题排查与修复方案
你的代码出现段错误或输出异常,是由多个明确的代码错误导致的,下面逐一分析并给出修复方法:
1. 初始化函数的参数类型错误与拼写失误
- 错误点:
- 函数定义
void initialize(int **a, unsigned int len)使用二级指针,但传入的数组名会退化为一级指针int*,类型不匹配;且函数内*(a + counter) = 0是给指针赋值0,而非给数组元素置0。 - main函数中调用初始化函数时拼写错误:
intialize应为initialize。
- 函数定义
- 修复:
修改initialize函数参数为一级指针,同时修正拼写:
main中修正调用:void initialize(int *a, unsigned int len) { int counter = 0; while(counter < len) { a[counter] = 0; // 用数组下标更易读 counter++; } }initialize(frequency_array, array_size(inp_str));
2. 单词分割的索引跳转错误
- 错误点:
ncounter = ncounter + ecounter + 2;中+2完全错误,单词结束后仅需跳过1个空格(如果存在),加2会跳过过多字符,导致后续单词无法处理,甚至触发数组越界。 - 修复:
改为判断式跳转,避免越界:// 更新ncounter前判断是否已到字符串末尾 if (*(inp_str + ncounter + ecounter) != '\0') { ncounter += ecounter + 1; } else { ncounter += ecounter; }
3. 单词统计的循环条件错误
- 错误点:
while (ncounter <= real_length)会在ncounter等于字符串长度时,统计一个长度为0的空单词(此时ecounter为0),导致frequency_array[0]莫名自增,还可能触发越界访问。 - 修复:
改为while (ncounter < real_length),确保只处理字符串内的有效字符。
4. 输出逻辑的严重缺陷
- 错误点:
putchar(*(frequency_array + ncounter) + '0')仅能输出0-9的数字,当单词出现次数超过9时会输出乱码;且连续输出5000个数字可读性极差,大部分都是无意义的0。 - 修复:
改为按实际统计值输出,用printf打印清晰格式:ncounter = 0; // 只输出到最大可能的单词长度(BUFFER_SIZE)即可 while (ncounter <= BUFFER_SIZE) { if (frequency_array[ncounter] > 0) { printf("长度为%d的单词出现%d次\n", ncounter, frequency_array[ncounter]); } ncounter++; }
5. 输入函数的边界处理漏洞
- 错误点:
input_str未处理getchar()返回EOF的情况(比如用户按下Ctrl+D),会导致死循环。 - 修复:
在循环内增加EOF判断:inpchar = getchar(); if(inpchar == EOF || inpchar == '\n' || inpchar == delimeter) { *(str+incvar) = '\0'; return; }
额外优化建议
array_size宏设为5000过于冗余,输入字符串最大长度是1024,数组大小设为BUFFER_SIZE + 1即可,避免内存浪费。- 可以用标准库函数
strlen替代自定义的lenstr,用strtok简化单词分割逻辑,若要保留自定义函数也可正常使用。
修复后的代码可正常统计单词长度直方图,不会出现段错误或输出异常。
内容的提问来源于stack exchange,提问作者FariyaAchhab
相关产品推荐
相关产品推荐

