我有一个类似于此的字符串数组:
char* arrStrings[] = {"a", "be", "|", "cgg", "dss", "|", "mmd", "ddd", "\0"}
1)我希望能够将其拆分为一组数组,基于“|”的位置性格是。
所以,在分裂之后,我会有这个:
a1 = {"a", "be", "\0"}
a2 = {"cgg", "dss", "\0"}
a3 = {"mmd", "ddd", "\0"}
2)之后,我需要创建一个包含所有3个数组的链表,如下所示:
list = {pointer to a1, pointer to a2, pointer to a3}
我对此非常困惑,因为涉及多个级别的指针。我怎么能做到这一点?
答案 0 :(得分:2)
如果你可以在列表中使用NULL
作为分隔符,则不需要复制字符串,只需使用指向字符串的数组。
*arrStrings[] = {"a", "be", "|", "cgg", "dss", "|", "mmd", "ddd", ""};
转化为
*arr [] = {"a", "be", NULL, "cgg", "dss", NULL, "mmd", "ddd", NULL};
填充数组后,您可以使用指向字符串的指针数组来创建列表:
*arr [] = {"a", "be", NULL, "cgg", "dss", NULL, "mmd", "ddd", NULL};
**ptr [] = { ^ ^ ^ };
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
/* The array */
char *arrStrings[] = {"a", "be", "|", "cgg", "dss", "|", "mmd", "ddd", ""};
/* Elements of the array */
size_t sz = sizeof(arrStrings) / sizeof(arrStrings[0]);
/* Loop */
size_t i, n = 0;
/* Create an array (VLA) of n pointers */
char *arr[sz];
/* Count the number of delimiters and fill array */
for (i = 0; i < sz; i++) {
/* If we found a delimiter assign NULL */
if (strcmp(arrStrings[i], "|") == 0) {
arr[i] = NULL;
n++;
} else
/* If we found an empty string assign NULL */
if (arrStrings[i][0] == '\0') {
arr[i] = NULL;
} else {
arr[i] = arrStrings[i];
}
}
/* Create an array (VLA) of n delimiters pointers to pointer */
char **ptr[n + 1];
ptr[0] = &arr[0];
for (i = n = 0; i < sz - 1; i++) {
/* For each NULL string push address of array + 1 into ptr */
if (arr[i] == NULL) {
ptr[++n] = &arr[i + 1];
}
}
/* For each pointer to pointer loop and print until NULL */
char **str;
for (i = 0; i <= n; i++) {
str = ptr[i];
printf("%zu)\n", i);
while (*str != NULL) {
printf("\t%s\n", *str);
str++;
}
}
return 0;
}
输出:
0)
a
be
1)
cgg
dss
2)
mmd
ddd
答案 1 :(得分:0)
首先要知道的是,字符串数组是指向固定数量的字符的其他指针的指针
arrString --> |_|_|_| ... |_|
| | | |
V V V V
a b | \0
e
因此你不能简单地更新“|”带有“\ 0”的元素并管理字符串,因为它将是“strtok”函数。相反,你必须分配三个新的“char **”数组来维护三个“char *”序列,并使用它们来创建你喜欢的列表。
如果你想避免分配新的内存空间,那么你必须实现自定义工具,以便根据其格式解析“char **”数组。通过这种方式,您可以在“arrString”中有三个指向三个不同位置的指针,它们定义了属于感兴趣的数组的第一个子字符串。最后一个元素“|”或“\ 0”表示没有其他元素属于它。但是,正如我已经说过的,这需要你实现ad-hoc函数,这样可以避免改变数组。