首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用“\0”拆分字符串

使用“\0”拆分字符串
EN

Stack Overflow用户
提问于 2022-05-22 16:28:11
回答 1查看 66关注 0票数 -5

假设我有一个char* ./a.out\0a\0b\0\0。我想把它和结果分割成一个字符**值

代码语言:javascript
复制
{
    "./a.out\0",
    "a\0",
    "b\0",
    "\0"
}

我使用的是纯c+ POSIX,但是如果一个答案包含c++STL的部分内容,我不介意,只需避免内存效率低下的部分,比如std::string

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-22 16:37:15

假设您知道有多少字符串相邻,下面是从复合字符串填充指针数组的简单方法:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "./a.out\0a\0b\0";  // 3 strings
    const char *args[3];

    const char *p = str;
    for (int i = 0; i < 3; i++) {
        args[i] = p;
        p += strlen(p) + 1;
    }

    for (int i = 0; i < 3; i++) {
        printf("args[%d] = \"%s\"\n", i, args[i]);
    }

    return 0;
}

输出:

代码语言:javascript
复制
args[0] = "./a.out"
args[1] = "a"
args[2] = "b"

下面是一个封装为分配数组的函数,通过扫描字节数组来确定字符串的数量,依赖于两个连续的空字节来指示列表的末尾:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char **split(const char *str) {
    const char **array;
    const char *p;
    int count = 0, i;

    // count the number of strings
    for (p = str; *p; p += strlen(p) + 1) {
        count++;
    }
    // allocate the array with an extra element for a NULL terminator
    array = calloc(sizeof(*array), count + 1);
    if (array != NULL) {
        // populate the array with pointers into the string
        for (i = 0, p = str; i < count; i++, p += strlen(p) + 1) {
            array[i] = p;
        }
        // set the NULL terminator
        array[i] = NULL;
    }
    return array;
}

int main() {
    const char *str = "./a.out\0a\0b\0";  // 4 strings
    const char **args = split(str);

    for (int i = 0; args[i] != NULL; i++) {
        printf("args[%d] = \"%s\"\n", i, args[i]);
    }
    return 0;
}

输出:

代码语言:javascript
复制
args[0] = "./a.out"
args[1] = "a"
args[2] = "b"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72339387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档