实现特定字符串重排时出现意外段错误,求问题排查与解决
嘿,我来帮你排查这个段错误并完成正确的实现~
首先,你的代码触发段错误的核心原因是指针访问的优先级搞错了:*string[i] 的运算顺序是先取 string[i](把string当成指针数组来访问),再解引用,但你的string是指向单个字符串的指针,这样访问必然会越界,直接触发段错误。正确的写法应该是 (*string)[i]——先解引用string拿到目标字符串,再访问下标i的字符。
除此之外,你的条件判断逻辑也有问题:用||会导致条件永远为真(一个字符不可能同时是+、-、*、/,所以!= '+' || != '-'这类条件永远成立),应该用&&来判断不是任何运算符,或者反过来判断“是运算符”时做对应处理。
下面是完整的正确实现,我用了双指针法来高效完成字符移动,同时处理了内存分配的安全性(避免修改只读字符串导致的未定义行为):
#include <stdio.h> #include <stdlib.h> #include <string.h> // 辅助函数:判断字符是否是目标运算符 int is_operator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } void mix_the_string(char **buff, char **string) { // 先做输入校验,避免空指针访问 if (buff == NULL || string == NULL || *string == NULL) { printf("Invalid input pointers!\n"); return; } printf("Original string: %s\n", *string); int str_len = strlen(*string); // 为结果分配内存,额外+1用来存字符串结束符 *buff = (char*)malloc(str_len + 1); if (*buff == NULL) { perror("Failed to allocate memory"); return; } int left_ptr = 0; // 指向非运算符的插入位置(从头部开始) int right_ptr = str_len - 1; // 指向运算符的插入位置(从尾部开始) // 遍历原字符串,一次遍历完成分类 for (int i = 0; i < str_len; i++) { char current_char = (*string)[i]; if (!is_operator(current_char)) { // 非运算符放到缓冲区头部 (*buff)[left_ptr++] = current_char; } else { // 运算符放到缓冲区尾部 (*buff)[right_ptr--] = current_char; } } // 别忘了添加字符串结束符 (*buff)[str_len] = '\0'; printf("Processed string: %s\n", *buff); } // 测试用例 int main() { char test_string[] = "x+y*z-w/v"; char *processed_result = NULL; mix_the_string(&processed_result, &test_string); // 使用完记得释放内存,避免泄漏 if (processed_result != NULL) { free(processed_result); } return 0; }
关键细节解释:
- 指针访问修正:用
(*string)[i]正确访问原字符串的第i个字符,彻底解决越界导致的段错误。 - 内存安全:在
buff指向的指针中分配新内存存储结果,避免直接修改原字符串(如果原字符串是常量字符串,直接修改会触发未定义行为)。 - 高效双指针:用
left_ptr和right_ptr分别从头部、尾部填充,一次遍历完成处理,时间复杂度O(n),效率拉满。 - 输入校验:增加了空指针判断,让函数鲁棒性更强。
- 内存释放:主函数中记得释放分配的内存,养成良好的内存管理习惯。
测试输出示例:
运行上面的代码,输入字符串x+y*z-w/v,会得到:
Original string: x+y*z-w/v Processed string: xyzwv+-*/
内容的提问来源于stack exchange,提问作者fklpsdev
相关产品推荐
相关产品推荐

