You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:45:10