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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:24:05