反转括号内字符串代码:仅调试时触发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
相关产品推荐
相关产品推荐

