C语言移除字符串中括号及其内容的最优实现方法
C语言移除字符串中方括号及其内部内容的最优实现
核心思路
由于输入的char*指向只读字符串字面量,无法直接修改,因此必须先将字符串复制到可写内存缓冲区,再通过双指针遍历的方式跳过方括号[]及其内部的所有内容,最终生成处理后的字符串。这种方法的时间复杂度为O(n),空间复杂度为O(n),是效率较高的实现方式。
代码实现
#include <stdio.h> #include <stdlib.h> #include <string.h> char* remove_brackets_content(const char* s) { // 分配足够内存存储结果(最坏情况与原字符串长度一致) char* result = malloc(strlen(s) + 1); if (!result) { perror("malloc failed"); return NULL; } char* dest = result; // 写指针,指向结果缓冲区的当前位置 const char* src = s; // 读指针,遍历原字符串 while (*src != '\0') { if (*src == '[') { // 跳过所有字符直到找到']'或字符串结束 while (*src != '\0' && *src != ']') { src++; } // 若找到']',再跳过该字符 if (*src == ']') { src++; } } else { // 复制当前字符到结果缓冲区,同时移动两个指针 *dest++ = *src++; } } // 添加字符串终止符 *dest = '\0'; // 可选:重新分配内存缩小到实际长度,优化内存占用 char* trimmed = realloc(result, strlen(result) + 1); if (trimmed) { result = trimmed; } return result; } // 测试示例 int main() { const char* s1 = "this is a string"; const char* s2 = "this is a string [this is more string]"; char* processed1 = remove_brackets_content(s1); char* processed2 = remove_brackets_content(s2); if (processed1) { printf("处理后s1: %s\n", processed1); free(processed1); // 记得释放内存避免泄漏 } if (processed2) { printf("处理后s2: %s\n", processed2); free(processed2); } return 0; }
关键细节说明
- 内存处理:必须使用
malloc/strdup分配可写内存,直接修改字符串字面量会触发未定义行为。 - 未闭合括号处理:如果字符串中只有
[没有对应的],会自动跳过从[到字符串末尾的所有内容,符合“移除括号及内部”的需求;若需要保留未闭合的部分,可以调整逻辑。 - 内存优化:
realloc步骤是可选的,如果对内存占用不敏感可以省略,不影响功能。 - 内存释放:调用函数后必须手动释放返回的字符串,避免内存泄漏。
内容的提问来源于stack exchange,提问作者spiderwebdev
相关产品推荐
相关产品推荐

