我正在尝试将文字文件中的单词带到链接列表中。
FILE *f = fopen("test.txt","r");
while (fgets( line, sizeof(line), f ))
for (word = strtok(line, " "); word; word = strtok(NULL, " "))
{
temp->data=word;
temp->next=(node *) malloc(sizeof(node));
printf("%s\n",word); // this prints the words correctly
temp=temp->next;
}
但是当我列出链表开头的单词时,它们是不正确的。我认为它关于strtok?
答案 0 :(得分:2)
您正在将文件的行读入一个缓冲区,该缓冲区可以重复用于每一行 - line
。
strtok
返回指向它所操作的缓冲区的指针。
将strtok
的结果存储到链接列表中,而不复制字符串。
当您读取下一行时,该指针仍然指向该行中的相同位置,但现在该行中有不同的数据。你不会得到你期望的。
要修复它,您需要将结果(使用strcpy
或类似的东西)复制到链接列表中的缓冲区中。如果您有strdup
可用,则可能需要使用它。
答案 1 :(得分:0)
您正在将temp->data
设置为word
指针。这不会复制这个词。 strtok()
更改缓冲区,因为您只是指向该单词而不是复制它,您也会看到这些更改。
如果要保留它,请复制word
。
答案 2 :(得分:0)
这不是strtok。您没有将每个单词复制到其他位置。所以你要保持指向line
内的单词的指针,然后下一次调用fgets会覆盖用下一行字符指向的数据
答案 3 :(得分:0)
您的链接列表存储指向同一内存区域的指针,即line
,它会在每个换行符处更新。
您应该使用malloc()
为每个单词分配内存,并使用strcpy()
制作单词的副本。
答案 4 :(得分:0)
这个词是指向strtok内部缓冲区的指针。
解决方案是分配temp->数据来保存当前存储在单词字符串中的足够的字符,然后执行strcpy