关于:strtok功能

时间:2010-12-08 22:58:07

标签: c

我正在尝试将文字文件中的单词带到链接列表中。

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?

5 个答案:

答案 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