所以我有一个缓冲区(数组):
char *buf;
buf = malloc(1024);
buf就像"foo\0bar\0foo\0bar\0\0\0\0\0\0\0..."
它包含由null终止符分隔的字符串。我需要将每个字符串分开。我尝试使用strtok()和\ 0作为删除者,但当然它没有用。我怎样才能实现这一目标?之后,每个字符串都需要在其他地方“复制”。
答案 0 :(得分:0)
由于您所拥有的实际上不是字符串而是可能包含空值的字符数组,因此您可以使用memchr
函数来搜索数组中的空值。然后,您可以使用strncpy
或strcpy
复制单个字符串。
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。
结束