c - c 中的 strtok 有问题

标签 c linked-list strtok csv

我已经编写了一些代码来帮助我在我的程序中为更大的链表分隔破折号,但是当我调用该类时,我的代码卡在分隔符循环中并且没有死掉。我什至不能用 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,"-");它卡在第一个 token 上。我似乎找不到问题,我的一个 friend 建议它与链接列表节点有关,但我删除了它们并且我遇到了同样的问题。

我在这段代码片段中调用了 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);
    };

最佳答案

您的代码大部分结构良好,并且正确使用了 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;
                            }
            }
}

关于c - c 中的 strtok 有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54562319/

相关文章:

java - 链表数组

c - 如何使用strtok获取单词

c++ - 这种壁垒的做法对吗?

c++ - 如何在 C 和 C++ 中定义结构之间的某种继承?

algorithm - 在二叉树中找到最便宜的路径?

c - 将 strtok 标记分配给结构中的数组

c - 如何将已解析的字符串放入 malloc/calloc/动态内存中?

c - Yocto-gcc 找不到共享库

c - realloc()、生命周期和 UB

java - 双链表的冒泡排序