C语言查找字符串最高频子串,代码运行崩溃问题求助
C语言查找字符串最高频子串崩溃问题修复
核心错误点
- 野指针非法访问:代码中定义的
char *c、char *temp没有分配内存空间,直接调用strcpy写入数据属于非法内存操作,是直接导致崩溃的核心原因。 - 语法错误:
if(strlen(c>0)括号位置错误,正确写法为if(strlen(c) > 0)。 - 数组越界风险:遍历
suffix数组时没有校验下标j是否超过传入的长度参数length,会读取无效内存内容。 - 计数逻辑错误:统计所有子串总量的
number变量更新逻辑错误,导致后续子串重复次数统计时遍历范围异常。
修复后完整可运行代码
头文件部分保持不变:
#include <stdio.h> #include <stdlib.h> #include <string.h>
修复后的功能函数:
void most_repeated(int length, char suffix[length][100]) { // 将野指针替换为固定长度数组,分配合法栈内存 char c[100], temp[100] = {0}; strcpy(c, suffix[0]); int j = 0, count = 0, number = 0, max = 0; char string[1000][100] = {0}; // 初始化数组避免脏数据干扰 // 生成所有后缀的前缀子串 while (j < length) { // 增加边界判断避免数组越界 for (int i = number; i < 1000; i++) { if (strlen(c) > 0) { // 修复语法错误 strcpy(string[i], c); c[strlen(c) - 1] = '\0'; number++; // 每存入一个子串累加计数 } else { break; } } j++; if (j < length) { // 取下一个后缀前先判断边界 strcpy(c, suffix[j]); } } // 统计出现次数最多的子串 j = 0; while (strlen(string[j]) > 0 && j < number) { count = 0; for (int i = 0; i < number; i++) { if (strcmp(string[j], string[i]) == 0) { count++; } } if (count > max) { strcpy(temp, string[j]); max = count; } j++; } printf("\n出现次数最多的子串:%s\n重复次数:%d\n", temp, max); }
可选优化
如果需要实现相同出现次数下优先保留更长子串的逻辑,只需要在count>max的判断分支后新增判断:当count == max时对比当前子串和已保存temp的长度,保留更长的子串即可。
内容的提问来源于stack exchange,提问作者Yodax93
相关产品推荐
相关产品推荐

