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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:10:49