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

《Pointers On C》习题6.18-2删除子串代码运行失败求排查

问题排查与修复

核心错误点

  • 内存访问权限错误(直接导致崩溃)
    main函数中定义的char *source = "hello, people."指向的是字符串字面量,C标准规定字符串字面量存储在只读内存段,尝试修改会触发段错误,是运行崩溃的直接原因。
  • 子串匹配逻辑错误
    del_substr函数的内层匹配循环存在漏洞:每次字符比较无论是否相等,offset和suboffset都会自增,匹配失败后又额外执行了offset++,会导致原串字符被跳过,出现漏匹配问题。
  • 拷贝逻辑偏移计算错误
    匹配成功后的字符串前移逻辑偏移量计算错误,会导致拷贝后的字符串出现乱码、多删或少删的问题。

注:原代码中的find_char函数未被调用,不需要可以直接删除。

修复后的完整代码

#include <stdio.h>

int del_substr(char *str, char const *substr)
{
    int offset = 0;
    int suboffset = 0;
    int match_start = 0; // 记录子串匹配的起始位置

    if (str == NULL || substr == NULL || *substr == '\0')
        return 0;
    while(*(str + offset) != '\0')
    {
        match_start = offset;
        suboffset = 0;
        // 修正匹配逻辑:只有字符相等时才同时移动两个指针
        while(*(str + offset) != '\0' && *(substr + suboffset) != '\0' 
              && *(str + offset) == *(substr + suboffset)) {
            offset++;
            suboffset++;
        }
        // 完全匹配到子串
        if(*(substr + suboffset) == '\0')
        {
            // 从匹配起始位置开始,将后续字符前移覆盖子串
            char *dst = str + match_start;
            char *src = str + offset;
            while ((*dst++ = *src++) != '\0');
            return 1;
        }
        // 匹配失败,回到本次匹配起始位置的下一个字符重新尝试
        offset = match_start + 1;
    }

    return 0;
}

int main()
{
    // 改为字符数组,存储在栈上支持修改
    char source[] = "hello, people.";
    char *chars = "peo";

    del_substr(source, chars);
    printf("result:%s\n", source);
    // 输出结果:result:hello, ple.
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:15:02