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

C语言自定义string_deletion函数调用触发运行错误的原因问询

问题原因及修复方案

核心崩溃原因

1. string_deletion函数存在未定义行为

你写的赋值语句*(index-m)=*(index++);违反了C语言的序列点规则:同一条表达式中,对index既进行取值运算(计算index-m和读取*index),又进行自增修改,且两者没有明确的执行顺序,不同编译器处理逻辑不同,大概率会导致指针计算错误、内存访问异常。

2. string_search的循环终止条件存在越界风险

你在循环中调用删除函数修改了原字符串的长度,但循环逻辑未适配长度变化:子串删除后字符串整体长度变短,原有的边界判断会失效,m指针持续递增后会超出main_string数组的100字节边界,访问非法内存触发崩溃。
另外如果要删除的子串长度大于原字符串长度,string_len(s)-string_len(d)会得到负数,转为无符号地址后是极大值,循环会直接越界。

修复代码

1. 修复string_deletion的未定义行为

把自增操作拆分到单独的语句,明确执行顺序:

void string_deletion(char *s, int m)
{
    char *index = s + m;
    while(*index != 0)
    {
        *(index - m) = *index;
        index++;
    }
    *(index - m) = 0;
}

2. 修复string_search的循环逻辑

每次匹配到子串删除后,不需要递增m指针(因为后面的字符已经左移,当前m位置已经是新的字符,需要重新判断),同时先做长度校验,动态更新原字符串长度:

void string_search(char *s,char *d)
{
    int len_d = string_len(d);
    int len_s = string_len(s);
    // 子串长度不合法直接返回
    if (len_d == 0 || len_s < len_d) return;
    char *m = s;
    char word_buffer[20];
    // 循环条件改为不超过最大可匹配起始位置
    while(m <= s + len_s - len_d)
    {
        if(*m == *d)
        {   
            int i = 0;
            char *r = m;
            char *buffer_index = word_buffer;
            while(i < len_d && *r != 0)
            {
                *(buffer_index++) = *(r++);
                i++;
            }
            *buffer_index = 0;
            if(string_comp(word_buffer, d) == 0)
            {
                printf("\nInvoking deletion sequence\n");
                string_deletion(m, len_d);
                // 删除后更新原字符串长度,跳过m递增,当前位置需要重新匹配
                len_s = string_len(s);
                continue;
            }
        }
        m++;
    }
}

其他可优化点

  • word_enter函数需要增加输入长度校验,避免输入内容超过数组容量导致缓冲区溢出
  • 可以直接用标准库的strlen、strcmp、strstr函数替代自主实现的对应功能,减少手写代码出错概率

内容的提问来源于stack exchange,提问作者LordObnoxious

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:15:05