用C分隔数组

时间:2017-04-28 19:01:21

标签: c arrays null

所以我有一个缓冲区(数组):

char *buf;
buf = malloc(1024);

buf就像"foo\0bar\0foo\0bar\0\0\0\0\0\0\0..." 它包含由null终止符分隔的字符串。我需要将每个字符串分开。我尝试使用strtok()和\ 0作为删除者,但当然它没有用。我怎样才能实现这一目标?之后,每个字符串都需要在其他地方“复制”。

2 个答案:

答案 0 :(得分:0)

由于您所拥有的实际上不是字符串而是可能包含空值的字符数组,因此您可以使用memchr函数来搜索数组中的空值。然后,您可以使用strncpystrcpy复制单个字符串。

char *p = buf;
char *list[1024];
int cnt = 0;
while (p) {
    char *n = memchr(p, 0, 1024 - (p-buf));
    if (n) {
        list[cnt++] = strdup(p);
    } else {
        int size = 1024 - (p-buf);
        list[cnt] = malloc(size + 1);
        strncpy(list[cnt], p, size);
        list[cnt++][size] = 0;
    }
    p = n;
    if (p) p++;
}

我们首先将p设置为buf的开头。然后在每次迭代时,我们使用memchr来查找p和数组末尾之间的下一个空字节。如果我们找到一个,我们可以将p视为字符串,并使用strdup为字符串分配空间并复制该字符串。如果我们没有找到null,我们将剩余的字节复制到新分配的缓冲区并手动添加空字节。

请注意,您需要知道缓冲区的大小,以便您不会读取它的结尾。

编辑:

最初编写的代码存在问题。在一次迭代之后,p指向空字节,因此memchr将继续返回指向该字节的指针。我在循环结束时添加了超过该字节的增量,因此不会再次检查它。

答案 1 :(得分:0)

您可以浏览数组并将除\ 0之外的每个字符复制到另一个数组/结构中,具体取决于"其他地方"需要是。所以每个字符串都以\ 0。

结束