其在C strtok的问题

问题描述 投票:1回答:1

我已经写了一些代码,以帮助我deliminate破折号在我的程序获得较大链表,但是当我调用类的我的代码卡上的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(令牌“ - ”);它卡住上的第一个标记。我似乎无法找到问题,我的一个朋友建议它与链表节点做的,但我删除他们,我有同样的问题。

我所说的分隔符类在此代码段。

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);
    };
c linked-list strtok delimited-text
1个回答
0
投票

您的代码主要是结构化的确定,正确地使用strtok。但你不初始化分配的节点内的变量或字段。我换你的电话从strcpy的到的strdup所以你分配内存,并使用释放calloc代替的malloc,使指针被初始化为null。在deliminator,你只需要分配的节点内环路,并只保留一个指针TRAV遍历列表,你可以独自离开根节点。

我离开了,如果你要弄清楚如何不浪费一个根节点,你并不真正需要的内存。你应该有一个根指针,并通过在其地址deliminator。此外,你应该清理和你在退出之前释放的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;
                            }
            }
}
© www.soinside.com 2019 - 2024. All rights reserved.