在C语言中将单词保存到链表中的问题

在C语言中将单词保存到链表中的问题,c,pointers,struct,linked-list,nodes,C,Pointers,Struct,Linked List,Nodes,在save函数之后,所有的数字都通过了,但是下面是控制台打印出来的内容以及在California.txt文件中重写的内容 Desktop-computer 100 Desktop-screen 100 Desktop-keyboard 100 TV-set 80 Audio-system 75 Bed 65 Night-table 65 Hibachi 35 我试图将char tempName(在load中找到的字符串)变成一个指针,并像那样运行函数,但随后控制台打印出来并保存到califor

在save函数之后,所有的数字都通过了,但是下面是控制台打印出来的内容以及在California.txt文件中重写的内容

Desktop-computer 100
Desktop-screen 100
Desktop-keyboard 100
TV-set 80
Audio-system 75
Bed 65
Night-table 65
Hibachi 35
我试图将char tempName(在load中找到的字符串)变成一个指针,并像那样运行函数,但随后控制台打印出来并保存到california文件

{°@u&0@ 35
{°@u&0@ 65
{°@u&0@ 65
{°@u&0@ 75
{°@u&0@ 80
{°@u&0@ 100
{°@u&0@ 100
{°@u&0@ 100
我真的陷入了死胡同,我不知道如何解决这个问题,任何建议都会有帮助。如果工作正常,应将以下内容打印到控制台

Hibachi 35
Hibachi 65
Hibachi 65
Hibachi 75
Hibachi 80
Hibachi 100
Hibachi 100
Hibachi 100

我认为你的问题是你保存的是同一个指针

看:

typedef结构节点
{
国际优先权;

char*itemName;itemName=tempName;itemName,tempName);
并查看它是否有效。

您的
节点通过指针存储名称

typedef struct node
{
 int priorityc;
 char *itemName; <= here you have pointer
 struct node *next;
} node;`
但是在
load()中
您不为每个节点分配内存。您只需将其指向
tempName
,这是一个局部变量,因此在函数的末尾,您会得到一个悬空指针。您需要为每个
itemName
分配内存,然后使用
strcpy
等函数将结果复制到其中

另一种选择是使用固定长度数组,例如

char *itemName;

然后进入它。

你可能会错误地认为你的任务陈述:

char itemName[80];
将整个字符串从一个地方复制到另一个地方。在许多其他编程语言中可能是这样的;在C语言中则不是这样

此语句所做的只是将缓冲区
tempName
的内存地址复制到指针变量
tempNode->itemName
中。这有两种错误

  • 通过反复执行此操作,链接列表中的所有节点最终都会引用相同的字符串缓冲区。此缓冲区会被重复覆盖;最后,剩下的是从文件中读取的最后一行。无论您访问哪个节点,都将始终看到相同的字符串
  • tempName
    是一个。一旦程序流离开函数
    load
    ,它的内存可能会被回收。链接列表随后会继续引用该内存。这是一个导致未定义行为的主要错误
  • 解决方案是复制字符串。使用函数
    strdup
    很容易做到这一点。只需替换这行代码:

    tempNode->itemName = tempName;
    
    作者:


    除非将内存分配给
    tempNode->itemName
    ,否则它不会工作。类似问题:
    char itemName[80];
    
    tempNode->itemName = tempName;
    
    tempNode->itemName = tempName;
    
    tempNode->itemName = strdup(tempName);