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

C语言字符串处理触发Segmentation fault (core dumped)错误求助

问题分析与解决

需求为在字符串的每个大写字母前添加空格(示例:AaaBbbCcC → Aaa Bbb Cc C),现有代码触发Segmentation fault (core dumped)错误,以下是具体分析与修正方案:

错误原因分析

  • 数组越界访问:数组s的大小为500,但每次插入空格时都会让stringsize自增,未检查剩余空间。当插入空格过多时,字符串总长度超过数组容量,访问到数组外的内存,触发段错误。
  • 循环逻辑缺陷:for循环以s[i] != '\0'为条件,插入空格后原大写字母会被移到i+1的位置,下一次循环i++会重复处理该字符,最终因无限循环+数组越界触发错误;同时插入空格后直接重置a的值,导致后续字符移动范围逻辑错误。
  • scanf格式符错误:代码中scanf("%199[^\n]s", s);多了一个s,正确格式应为%199[^\n],多余的s会导致输入处理异常。

修正后的代码

#include <stdio.h>
#include <ctype.h>

#define TAM 500

void function(char s[]) {
    // 统计原字符串长度与需要插入的空格数
    int original_len = 0;
    int space_count = 0;
    while (s[original_len] != '\0') {
        if (isupper((unsigned char)s[original_len])) {
            space_count++;
        }
        original_len++;
    }

    // 检查插入空格后的总长度是否超出数组容量(预留'\0'位置)
    if (original_len + space_count >= TAM) {
        printf("Error: 字符串过长,无法插入足够空格\n");
        return;
    }

    // 从后往前移动字符并插入空格
    int target_idx = original_len + space_count;
    s[target_idx] = '\0'; // 设置新的字符串结束符

    for (int i = original_len - 1; i >= 0; i--) {
        if (isupper((unsigned char)s[i])) {
            s[--target_idx] = s[i];
            s[--target_idx] = ' ';
        } else {
            s[--target_idx] = s[i];
        }
    }
}

int main() {
    char s[TAM];
    // 限制输入长度为TAM-1,避免数组越界
    scanf("%499[^\n]", s);
    function(s);
    printf("%s\n", s);
    return 0;
}

代码说明

  • 提前统计空格数:先计算需要插入的空格总数,确认总长度不会超过数组容量,从根源避免越界。
  • 从后往前处理:无需反复移动前面的字符,效率更高,同时避免重复处理同一大写字母的问题。
  • 使用isupper函数:比直接判断字符范围更可靠,适配不同字符编码场景。
  • 修正输入逻辑:限制输入长度为数组容量减1,确保输入字符串不会超出数组范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:55:18