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

反转括号内字符串代码:仅调试时触发Segmentation fault求助

问题分析与修复方案

段错误的直接原因

你在main里传入的是字符串字面量(比如"foo(bar)baz(blim)"),这类字符串在C语言中被存储在只读内存区域。你的solution函数试图直接修改inputString的内容,这会触发内存访问违规,导致Segmentation fault。

修复步骤

1. 避免修改字符串字面量

在调用solution前,把字符串字面量复制到可写的内存区域,比如用字符数组或者malloc分配空间:

int main()
{
    // 方式1:用字符数组(自动分配可写内存)
    char input[] = "foo(bar)baz(blim)";
    char *text = solution(input);
    printf("text = %s", text);
    return 0;

    // 方式2:用malloc手动分配内存(记得最后释放)
    // const char *input_literal = "foo(bar)baz(blim)";
    // char *input = malloc(strlen(input_literal) + 1);
    // strcpy(input, input_literal);
    // char *text = solution(input);
    // printf("text = %s", text);
    // free(input);
    // return 0;
}

2. 修复嵌套括号的处理逻辑

当前代码仅反转括号内内容但未移除括号,也无法正确处理嵌套场景(比如foo(bar(zab))mlib需要先反转内层、再反转外层、最后去掉所有括号)。以下是优化后的完整逻辑:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *solution(char *inputString)
{
    int size = strlen(inputString);
    // 用栈存储左括号的索引,匹配最近的括号对
    int *stack = malloc(size * sizeof(int));
    int stack_top = -1;

    for (int i = 0; i < size; i++)
    {
        if (inputString[i] == '(')
        {
            stack[++stack_top] = i;
        }
        else if (inputString[i] == ')')
        {
            if (stack_top == -1)
                continue; // 跳过不匹配的右括号
            int start = stack[stack_top--];
            // 反转括号内的内容(start+1 到 i-1)
            int left = start + 1;
            int right = i - 1;
            while (left < right)
            {
                char temp = inputString[left];
                inputString[left] = inputString[right];
                inputString[right] = temp;
                left++;
                right--;
            }
            // 移除当前括号对:将后续字符向前移位
            memmove(inputString + start, inputString + start + 1, i - start - 1);
            memmove(inputString + start + i - start - 1, inputString + i + 1, size - i);
            size -= 2; // 字符串长度减少2
            i -= 2; // 回退索引,适配移位后的字符位置
        }
    }
    free(stack);
    return inputString;
}

int main()
{
    char input[] = "foo(bar(zab))mlib";
    char *text = solution(input);
    printf("text = %s\n", text); // 输出:foozabrabmilb
    return 0;
}

3. 原代码的其他细节问题

  • 原代码中j != 0的循环条件错误:若左括号在索引0的位置,循环会直接终止,无法匹配到左括号,应改为j >= 0。
  • 嵌套括号处理时未考虑字符串长度变化后的索引偏移,会导致后续反转逻辑出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:33:01