簡體   English   中英

實現一個 C 函數,該函數在給定字符上拆分字符串並在拆分后返回一個字符串數組(以及數組的長度)

[英]Implementing a C function that splits a string on a given character and returns an array of strings after the split (along with length of array)

我正在嘗試實現一個 C 函數,該函數接受一個字符串,然后在某個字符上斷開該字符串,並在拆分后返回一個字符串數組以及該數組的大小。 我為此使用了一個數據結構,因為返回一個二維數組(拆分后的字符串數組)並且它的長度是不可能的。 我的代碼如下:

struct charArr {
    char *arr[10000];
    int size;
};    

struct charArr *stringSplitter(char *str, char c) {
    struct charArr *splitString = (struct charArr *)malloc(sizeof(struct charArr));
    if (splitString == NULL) {
        fprintf(stderr, "malloc failed\n");
        exit(1);
    }
    splitString->size = 0;
    int i = 0;
    int j = 0;

    while (str[i] != '\0') {
        if (str[i] == c) {
            splitString->arr[splitString->size][j] = '\0';

            (splitString->size)++;
            j = 0;
            i++;

            while (str[i] == c) {    /* this loop is to ignore continuous occurrences of the character c */
                i++;
            }
        } else {
            splitString->arr[splitString->size][j] = str[i];
            i++;
            j++;
        }
    }
    splitString->arr[splitString->size][j] = '\0';
    return splitString;
}

int main(int argc, char *argv[]) {

    // take input from command line
    if (argc == 1) {
        //buffer to store lines
        size_t buffer_size = 128;
        char *buffer = malloc(buffer_size * sizeof(char));
        if (buffer == NULL) {
            fprintf(stderr, "malloc failed\n");
            exit(1);
        }

        // loop continuously till user exits by ctrl+c
        while (1) {
            printf("Enter Input> ");
            getline(&buffer, &buffer_size, stdin);

            char *str = strdup(buffer);

            struct charArr *splitString = stringSplitter(str, '&');

            for (int i = 0; i<splitString->size; i++) {
                printf("%s ", splitString->arr[i]);
            }
        }
    }
    return 0;
}

在一個簡單的輸入上運行代碼(輸入是從命令行連續獲取的):

輸入輸入>這個和那個

我希望輸出是:

這個那個

但是,我收到錯誤:

分段錯誤(核心轉儲)

如果輸入如下圖(即分割字符連續出現):

輸入 Input> this &&& that

那么輸出也必須是:

這個那個

編輯:我試圖擴展這個分割在多個分隔符的字符串,以及(在一個GO),因此,而不是在上述功能炭C,如果字符* c的傳遞是定界符的一個字符串(例如,c = " \\t\\n"從給定的字符串中刪除所有空格),然后它也應該按預期工作並在拆分和數組長度后返回一個字符串數組。 例如,如果輸入是(多個空格、制表符和換行符):

Enter Input>      this                               that         

然后返回的數組(它是返回結構的一部分)的大小必須為 2,並且只包含 2 個字符串 - “this”和“that”。

這是您的函數的重寫,其中包含使用 strdup() 正確分配每個找到的字符串所需的更正:

您可以在以“以前”開頭的評論之前找到我的修改:

struct charArr* stringSplitter(char *str, char c){
    struct charArr* splitString = (struct charArr*)malloc(sizeof(struct charArr));
    char buffer[ MAX_BUFF ] ;
    if(splitString == NULL){
        fprintf(stderr, "malloc failed\n");
        exit(1);
    }
    splitString->size = 0;
    int i=0;
    int j=0;

    while(str[i] != '\0'){

        if(str[i] == c){
            //Previously:  splitString->arr[splitString->size][j] = '\0';
            splitString->arr[splitString->size] = strndup( buffer , j ); 

            (splitString->size)++;
            j = 0;
            i++;

            while(str[i] == c){    /* this loop is to ignore continuous occurrences of the character c */
                i++;
            }
        } else {
            // Previously:  splitString->arr[splitString->size][j] = str[i];
            buffer[j] = str[i];
            i++;
            j++;
        }

    }
    //Previously:  splitString->arr[splitString->size][j] = '\0';
    splitString->arr[splitString->size++] = strndup( buffer , j ); 
    return splitString;
}

我已經很久沒有寫任何 C 語言了,所以我認為這將是一個挑戰。 這是 stringSplitter 函數的重寫。

struct charArr* stringSplitter(char *str, char c){
    struct charArr* splitString = (struct charArr*)malloc(sizeof(struct charArr));
    if(splitString == NULL){
        fprintf(stderr, "malloc failed\n");
        exit(1);
    }
    splitString->size = 0;
    char sep[2];
    sep[0] = c;
    sep[1] = (char) 0;

    char* next;
    while( (next = strtok( str, sep )) )
    {
      str = NULL;
      splitString->arr[ splitString->size++ ] = next;
    }

    return splitString;
}

上面,我只是使用strtok 查看 strtok() 的聯機幫助頁以了解其細微差別。

暫無
暫無

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

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