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

C程序Segmentation Fault(段错误)无法解决,求助排查

问题分析与修复方案

核心错误点

  • 空指针导致非法内存访问:处理最后一个单词时,findBlank返回NULL,原代码执行start = temp + 1会得到0x1,下一次循环访问*start触发段错误。
  • 最后一个单词长度未统计:当temp为NULL时,原代码的while(start < temp)条件不成立,无法统计最后一个单词的长度。
  • 指针移动逻辑混乱:原代码中移动start的条件错误,导致指针最终指向无效内存地址。

修复后的censor函数(不修改findBlank和fourStars)

void censor(char *start)
{   
    char *temp;

    while(*start != '\0') {
        int len = 0;
        temp = findBlank(start);
        // 区分中间单词与最后一个单词的长度统计逻辑
        if (temp != NULL) {
            while(start < temp){
                len++;
                start++;
            }
        } else {
            // 统计字符串末尾单词的长度
            char *end = start;
            while(*end != '\0'){
                len++;
                end++;
            }
            start = end;
        }

        // 替换4字母单词
        if(len == 4) {
            char *replace;
            if (temp != NULL) {
                replace = temp - len;
            } else {
                replace = start - len;
            }
            fourStars(replace);
        }
        
        // 仅当存在下一个单词时,移动指针到下一个单词起始
        if (temp != NULL) {
            start = temp + 1;
            // 跳过连续空格(增强健壮性)
            while(*start == ' ') {
                start++;
            }
        } else {
            // 最后一个单词处理完成,退出循环
            break;
        }
    }
}

修复说明

  1. 新增temp是否为NULL的判断,分别处理中间单词和末尾单词的长度统计。
  2. 处理末尾单词时,直接统计到字符串结束的长度,并将start移到末尾,避免后续非法访问。
  3. 修正指针移动逻辑:仅当存在下一个单词时,才将start移到空格后的位置,末尾单词处理完成后直接退出循环。
  4. 针对末尾的4字母单词,正确计算替换起始位置为start - len。

运行修复后的代码,原字符串"this is a test for the last word in line"会输出要求的结果:**** is a **** for the **** **** in ****

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:16:15