在c中的strtok有问题

时间:2019-02-06 20:47:52

标签: c linked-list strtok delimited-text

我已经写了一些代码来帮助我在程序中消除破折号以获得更大的链接列表,但是当我调用该类时,我的代码陷入了deliminator循环中并且不会消失。我什至无法使用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时 令牌= strtok(令牌,“-”);它卡在第一个令牌上。我似乎找不到问题,我的一个朋友建议它与链接列表节点有关,但我删除了它们,但遇到了同样的问题。

我在此代码段中称呼deliminator类。

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 :(得分:0)

您的代码大多结构良好,并且正确使用了strtok。但是,您不会初始化变量或分配的节点内的字段。我将您的调用从strcpy切换到strdup,以便分配内存,并使用calloc而不是malloc来将指针初始化为null。在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;
                            }
            }
}