根据字符拆分字符串数组

我有一个与此类似的字符串数组:

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} 

我很困惑,因为涉及多个指针级别。 我怎么能做到这一点?

如果您可以在列表中使用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  #include  #include  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 

首先要知道的是,字符串数组是指向固定数量的字符的其他指针的指针

 arrString --> |_|_|_| ... |_| | | | | VVVV ab | \0 e 

因此你不能简单地更新“|” 带有“\ 0”的元素并管理字符串,因为它将是“strtok”函数。 相反,你必须分配三个新的“char **”数组来维护三个“char *”序列,并使用它们来创建你喜欢的列表。

如果你想避免分配新的内存空间,那么你必须实现自定义工具,以便根据其格式解析“char **”数组。 通过这种方式,你可以在“arrString”中有三个指向三个不同位置的指针,它们定义属于感兴趣的数组的第一个子字符串。 最后一个元素“|” 或“\ 0”表示没有其他元素属于它。 但是,正如我已经说过的,这需要您实现ad-hoc函数,这样可以避免更改数组。