C语言中如何提取被\0空终止符分隔的多段字符串?
实现方案
你可以直接利用C标准库字符串处理函数的原生特性(所有标准字符串函数遇到\0都会自动终止处理),不需要自己逐字符遍历判断,以下是两种常用的简便实现:
方案1:指针偏移法(不修改原字符串,兼容所有C标准)
利用strlen()自动计算单段字符串长度的特性,直接偏移指针即可,代码如下:
#include <stdio.h> #include <string.h> int main() { const char *test = "Hello My\0friends\0I love food!"; const char *section1 = test; const char *section2 = section1 + strlen(section1) + 1; // 跳过当前段的结束\0 const char *section3 = section2 + strlen(section2) + 1; // 测试输出 printf("%s\n%s\n%s\n", section1, section2, section3); return 0; }
这个方案的优势是不会修改原字符串,即使原字符串是只读的字符串字面值也可以直接使用,无额外内存开销。
方案2:strtok()分割法(POSIX兼容,适合段数不固定的场景)
如果运行环境支持POSIX标准库,可以直接用strtok()指定分隔符为\0来分割。注意这个方法会修改原字符串,所以需要先把只读的字符串字面值拷贝到可写内存中:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { const char *test = "Hello My\0friends\0I love food!"; // 提前计算总长度后拷贝到可写堆内存,也可以根据实际业务场景简化拷贝逻辑 size_t len1 = strlen(test), len2 = strlen(test + len1 + 1), len3 = strlen(test + len1 + 1 + len2 + 1); char *buf = malloc(len1 + len2 + len3 + 3); memcpy(buf, test, len1 + len2 + len3 + 3); char *section1 = strtok(buf, "\0"); char *section2 = strtok(NULL, "\0"); char *section3 = strtok(NULL, "\0"); // 测试输出 printf("%s\n%s\n%s\n", section1, section2, section3); free(buf); return 0; }
如果段数不固定,这个方法可以用循环批量提取所有分段,不用提前声明固定数量的指针变量。
补充:如果需要处理动态长度的多分段场景,也可以自行封装一个简单的辅助函数,内部用
strlen偏移指针返回下一段的起始地址即可,逻辑非常简洁。
内容的提问来源于stack exchange,提问作者Jorge Jones
相关产品推荐
相关产品推荐

