首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于: strtok函数

关于: strtok函数
EN

Stack Overflow用户
提问于 2010-12-09 06:58:07
回答 5查看 232关注 0票数 0

我正在尝试将文本文件中的单词转换为链表。

代码语言:javascript
复制
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的?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-09 07:02:09

您将文件的行读入到一个单独的缓冲区中,每行都重用这个缓冲区-- line

strtok返回一个指向它所操作的缓冲区的指针。

您无需复制字符串即可将strtok的结果存储到链表中。

当您读取下一行时,指针仍然指向该行中的同一位置,但现在该行中有不同的数据。你不会得到你想要的。

要修复它,您需要将结果复制(使用strcpy或类似的方法)到链表的缓冲区中。如果您有可用的strdup,您可能想要使用它。

票数 2
EN

Stack Overflow用户

发布于 2010-12-09 07:02:07

您正在将temp->data设置为word指针。这不会复制单词。strtok()会更改缓冲区,因为您只会指向单词,而不是复制它,所以您也会看到这些更改。

如果你想保留它,可以复制一份word

票数 0
EN

Stack Overflow用户

发布于 2010-12-09 07:02:48

不是strtok。您不能将每个单词复制到其他位置。因此,您要将指向单词的指针保留在line中,然后下一次调用fgets时,将用下一行字符覆盖指向的数据

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4393199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档