c - 为什么我的链表只打印最后一个条目



我正在尝试从文件中读取特定行并将其添加到链表中,然后将其打印出来.
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 typedef struct list {
    int uid;
   char* uname;
   struct list* next;
}node;

void push(node ** head, int uid ,char* uname) {
    node * new_node;
    new_node = malloc(sizeof(node));
    new_node->uid = uid ;
    new_node->uname=uname;;
    new_node->next = *head;
    *head = new_node;
}

void print_list(node *head) {
    node * current = head;
    while (current != NULL) {
        printf("%u:%sn", current->uid,current->uname);
        current = current->next;
    }
}

int main(int argc, char **argv){
    node *current=NULL;
    FILE *fp=fopen(argv[1],"r" );
    if (fp==NULL){
        perror("Failed to open file");
        exit(EXIT_FAILURE);
    }
    char s[1024];
    const char token[2]=":";
    char *stoken;
    while(!feof(fp)){
        int count=0;
        int tempint;
        char* tempchar=malloc(sizeof(char));
        fgets(s, 1024, fp);
        stoken = strtok(s,token);
        current=malloc(sizeof(node));
        while(stoken != NULL){
            if (count==0){
                tempchar=stoken;
            }
            if (count==2){
                sscanf(stoken,"%d",&tempint);
            }
            count++;
        stoken=strtok(NULL,token);
        }
        push(&current,tempint,tempchar);
    }
    fclose(fp);
    print_list(current);
}

我的问题是当print_list运行时,唯一被打印的是最后一个条目。

对于此输入:

hello:asd:123:foo:ar
hi:proto:124:oo:br
hey:qwe:321:fo:bar

唯一被打印

的是
321:hey

是我的推动错了还是我的print_list?

问题在于您处理strtok结果的方式:您将它的值直接设置到节点中,而不是复制它。

添加节点时复制name

void push(node ** head, int uid ,char* uname) {
    node * new_node;
    new_node = malloc(sizeof(node));
    new_node->uid = uid;
    new_node->uname=malloc(strlen(uname)+1);
    strcpy(new_node->uname, uname);
    new_node->next = *head;
    *head = new_node;
}

您还应该查看在main函数中使用tempchar的方式。你为单个字符分配一个空格,它被strtok的结果覆盖,泄漏malloc -ed内存。

这是因为您总是在push()函数中覆盖head,因此最初应该将其NULL,然后检查它是否NULL第一次并为其分配第一个节点,然后不要对它进行任何确认,因此您的程序也因此而出现内存泄漏。

此外,您正在函数外部malloc()节点,然后再次在函数内部,这会导致另一个内存泄漏。

您还应该检查malloc()是否返回NULL这表示错误,例如当系统内存不足时,取消引用NULL指针是未定义的行为。

最后一点,您必须在访问目标变量之前检查 scanf() 的返回值,否则将再次导致未定义的行为。

更改如下所示

char* tempchar;//=malloc(sizeof(char));
fgets(s, 1024, fp);
stoken = strtok(s,token);
//current=malloc(sizeof(node));//don't update like this
while(stoken != NULL){
    if (count==0){
        tempchar=strdup(stoken);//malloc and strcpy

相关内容

  • 没有找到相关文章

最新更新