假设我有一个char* ./a.out\0a\0b\0\0。我想把它和结果分割成一个字符**值
{
"./a.out\0",
"a\0",
"b\0",
"\0"
}我使用的是纯c+ POSIX,但是如果一个答案包含c++STL的部分内容,我不介意,只需避免内存效率低下的部分,比如std::string
发布于 2022-05-22 16:37:15
假设您知道有多少字符串相邻,下面是从复合字符串填充指针数组的简单方法:
#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;
}输出:
args[0] = "./a.out"
args[1] = "a"
args[2] = "b"下面是一个封装为分配数组的函数,通过扫描字节数组来确定字符串的数量,依赖于两个连续的空字节来指示列表的末尾:
#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;
}输出:
args[0] = "./a.out"
args[1] = "a"
args[2] = "b"https://stackoverflow.com/questions/72339387
复制相似问题