簡體   English   中英

根據字符拆分字符串數組

[英]Split an array of strings based on character

我有一個類似於這樣的字符串數組:

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 <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

您必須知道的第一件事是,字符串數組是指向固定數量的其他字符指針的指針

arrString --> |_|_|_| ... |_|
               | | |       |
               V V V       V
               a b |       \0
                 e

因此,您不能簡單地更新“ |” 元素帶有“ \\ 0”並管理字符串,因為它例如是“ strtok”函數。 相反,您必須分配三個新的“ char **”數組來維護三個“ char *”序列,並根據需要使用它們來創建列表。

如果要避免分配新的內存空間,則必須實現自定義功能,以便根據其格式解析“ char **”數組。 這樣,您實際上可以擁有三個指向“ arrString”中三個不同位置的指針,這些指針定義了屬於感興趣數組的第一個子字符串。 最后一個元素“ |” 或“ \\ 0”表示沒有其他元素屬於它。 但是,正如我已經說過的那樣,這需要您實現即席功能,避免更改數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM