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

使用<cstring>库替代str.substr的方案有哪些?求string.h高效替代方法

关于<string.h>中substring功能的替代方案

C标准库的<string.h>中没有提供类似高级语言里str.substring()的现成函数——因为C语言的字符串是基于字符数组的原生实现,没有封装面向对象式的字符串操作方法。

以下是几种高效的替代方案:

  • 指针偏移(零拷贝,效率最高)
    C字符串本质是char*类型的指针,若仅需要从指定起始位置开始的子串,直接通过指针偏移即可获得子串的起始地址,无需额外内存分配和复制操作:

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str[] = "Hello, World!";
        int start_idx = 7; // 从第8个字符开始(C字符串索引从0开始)
        char* sub_str = str + start_idx; // 指向"World!"
        printf("%s\n", sub_str);
        return 0;
    }
    

    注意:这种方式下子串与原字符串共享内存空间,原字符串被修改时,子串的内容也会同步变化。

  • 内存复制生成独立子串
    如果需要完全独立的子串(不依赖原字符串内存),可以手动分配内存后复制内容,常用strncpy或memcpy实现:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main() {
        char str[] = "Hello, World!";
        int start_idx = 7;
        int sub_len = 5; // 截取"World"
        // 分配内存时需多留1字节存储字符串终止符'\0'
        char* sub_str = malloc(sub_len + 1);
        if (sub_str != NULL) {
            strncpy(sub_str, str + start_idx, sub_len);
            sub_str[sub_len] = '\0'; // strncpy不会自动添加终止符,需手动补充
            printf("%s\n", sub_str);
            free(sub_str); // 用完记得释放内存,避免泄漏
        }
        return 0;
    }
    

    用memcpy也能实现相同效果,效率和strncpy相近,同样需要手动添加终止符:

    memcpy(sub_str, str + start_idx, sub_len);
    sub_str[sub_len] = '\0';
    
  • 自定义封装substring函数
    若频繁需要子串截取操作,可以封装一个通用函数,方便复用:

    #include <string.h>
    #include <stdlib.h>
    
    char* substring(const char* str, int start_idx, int sub_len) {
        // 参数合法性检查
        if (str == NULL || start_idx < 0 || sub_len <= 0) {
            return NULL;
        }
        int str_total_len = strlen(str);
        if (start_idx >= str_total_len) {
            return NULL;
        }
        // 调整子串长度,避免超出原字符串范围
        if (start_idx + sub_len > str_total_len) {
            sub_len = str_total_len - start_idx;
        }
        // 分配内存并复制内容
        char* sub_str = malloc(sub_len + 1);
        if (sub_str != NULL) {
            memcpy(sub_str, str + start_idx, sub_len);
            sub_str[sub_len] = '\0';
        }
        return sub_str;
    }
    

    使用该函数后,记得调用free()释放返回的内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:25:39