使用<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
相关产品推荐
相关产品推荐

