Как сохранить структуру как узел связанного списка, и эта структура имеет char * words [10], которая является разобранной строкой? - PullRequest
0 голосов
/ 20 сентября 2019

Более конкретно, мой вопрос заключается в том, что я хочу сохранить структурные слова в связанном списке, и у каждого узла есть char * words [10] , это char * words [10] взято из проанализированной строки, каждое слово [i] является словом в этой строке (первые 10 слов).

У меня есть строка (в моем вопросе строка «Я - майка»).и хочу сохранить каждое слово в нем в моей структуре, в частности в словах [0] хранится «я», в словах [1] хранится «я», а в словах [2] хранится «трикотаж».Однако то, что я храню в нем, не слово, а NULL.Как решить эту проблему?

Кроме того, в * функции struct words * parse_string *, в ее третьей части, похоже, также есть некоторые проблемы.Когда я отлаживаю его, в буфере хранятся все символы в нем: «I», «», «a», «m», «» ... Это правильно?

Мой код прикрепленкак показано ниже.

Вот мой файл .c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hwTest.h"


int main(int argc, const char * argv[]) {
    struct words *w1 = NULL;
    int i;
    char *str = "I am jersey.";

    w1 = parse_string(" ", str);

    for(i = 0; i < w1->count; i++){
        printf("  [%d] = \"%s\"", i, w1->words[i]);
        printf("\n");
    }
}

struct words *parse_string(char *delimiter, char *string){
    //first allocate memory space;
    // Head pointer doesn't need to store data, it's used for iterating;
    words *wordsHead = (words *)calloc(1, sizeof(words));
    wordsHead->next = NULL;

    //Second, copy the input *string to the buffer field in struct words;
    strcpy(wordsHead->buffer,string); //这里就出现了问题:存储在buffer中的是‘I’ ‘ ’ ‘a’...

    //Third, use strtok to parse the contents of buffer into up to 10 words, delimited by the character in the string
    int x;
    for(x = 0; x<10; x++){
        char *temp = strtok(wordsHead->buffer, delimiter);
        if(temp == NULL){
            //When we finished, set int x to "words->count"
            wordsHead->count = x;
            break;
        }
        //Store individual word from "words" in "wordHead->words[x]" where x represents the index.
        wordsHead->words[x] = temp;

        // Finally, returns pointers to following words;
        strtok(wordsHead->buffer,NULL); /*pass NULL to 2nd and following calls*/
    }

    return wordsHead;
}

Вот мой файл .h:

#ifndef hwTest_h
#define hwTest_h


typedef struct words{
    // for a linked list;
    struct words *next;

    //to store the string to be parsed;
    char buffer[128];

    //number of words(up to 10);
    int count;

    //pointers to up to 10 words;
    char *words[10];

} words;

struct words *parse_string(char *delimiter, char *string);



#endif /* hwTest_h */

1 Ответ

0 голосов
/ 20 сентября 2019
for(x = 0; x<10; x++){
    char *temp = strtok(wordsHead->buffer, delimiter);
    // ...
    strtok(wordsHead->buffer,NULL); 
}

Это неправильный способ извлечения токенов из буфера.Измените это на

char *temp = strtok(wordsHead->buffer, delimiter);
for(x = 0; x<10; x++) {
   // ...
   strtok(NULL, delimiter); 
}

Обратите внимание на то, какой аргумент strtok меняется на NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...