我已经写了一些代码,以帮助我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);
};
您的代码主要是结构化的确定,正确地使用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;
}
}
}