возникли проблемы со strtok в c - PullRequest
0 голосов
/ 06 февраля 2019

Я написал некоторый код, чтобы помочь мне уменьшить тире в моей программе для большего связанного списка, но когда я вызываю класс, мой код застревает в цикле делимминатора и не умирает.Я не могу даже убить его с помощью команды kill. Мне нужно открыть новый ssh-клиент

int  deliminator(char word[], struct node *root){
    struct node *start =  (struct node*) malloc(sizeof(struct node));
    struct node *trav = (struct node*) malloc(sizeof(struct node));
    start->next= trav;
    trav->prev = start;

    char *token;
    token = strtok(word,"-");

    while(token){
            /* this loop is broken */

            printf("%s",token);
            struct node *curr  = (struct node*) malloc(sizeof(struct node));
            strcpy(curr->set, token);
            trav->next = curr;
            curr->prev = trav;
            trav = trav->next;

            token = strtok(NULL,"-");
    };
    root->next = start;
    return(0);


};

Также, когда я пытаюсь запустить strtok ненадлежащим образом, выполняя цикл с помощью token = strtok (token, "-");он застревает на первом жетоне.Кажется, я не могу найти проблему, мой друг предположил, что это связано с узлами связанного списка, но я удалил их, и у меня возникла та же проблема.

Я вызываю класс разделителя в этом фрагменте кода.

int main(int argc, char *argv[]){
    struct node *root = (struct node*) malloc(sizeof(struct node));
    struct node *trav = (struct node*) malloc(sizeof(struct node));
    root->next = trav;
    if(argc == 2){
    /*only one giant string*/
    deliminator(argv[1],root);
    while(root->next!= NULL){
    printf("%s",root->set);
    };

1 Ответ

0 голосов
/ 07 февраля 2019

Ваш код в основном структурирован нормально и правильно использует strtok.Но вы не инициализируете свои переменные или поля внутри выделенных узлов.Я переключил ваш вызов с strcpy на strdup, чтобы вы выделяли память, и использовал calloc вместо malloc, чтобы указатели инициализировались на нуль.В deliminator вам нужно всего лишь выделить узлы внутри цикла и просто сохранить указатель trav для обхода списка, и вы можете оставить корневой узел в покое.

Я оставил, если вам выяснить, какне тратьте память на корневой узел, который вам на самом деле не нужен.Вы должны просто иметь корневой указатель и передать его адрес в разделитель.Кроме того, вы должны очистить и освободить узлы и выделенные строки из strdup перед выходом.

int  deliminator(char word[], struct node *root) {
            struct node *trav = root;

            char *token;
            token = strtok(word,"-");

            while(token){
                            /* this loop is fixed! */

                            printf("DEBUG: %s\n",token);
                            struct node *curr  = calloc(1, sizeof(struct node));
                            curr->set = strdup(token);
                            trav->next = curr;
                            curr->prev = trav;
                            trav = trav->next;

                            token = strtok(NULL,"-");
            };
            return(0);


}

int main(int argc, char *argv[]){
            struct node *root = calloc(1, sizeof(struct node));
            if(argc == 2){
                            /*only one giant string*/
                            deliminator(argv[1],root);
                            root = root-> next;
                            while(root != NULL){
                                            printf("%s\n",root->set);
                                            root = root->next;
                            }
            }
}
...