1

我在使用时遇到问题strtok,我不知道是问题strtok出在哪里还是其他原因。

我有一个 .txt 文件,其中包含如下数据:

sometextdada;othertextdata
yetmoredata;andmoredata

读取的数据是以struct这种方式定义的存储:

typedef struct team{
    char *name;
    char *teamPlace;
}Team;

如果我这样做:

char buffer[100];
Team eq;
/*Read first line*/
fgets(buffer, 100, equipas)!= NULL);
eq.name= strtok(buffer,";\n");
eq.teamPlace= strtok (NULL,";\n");

printf("%s %s\n", eq.name,eq.teamPlace);

我可以看到它按strtok预期工作并存储sometextdadaeq.nameothertextdataeq.teamPlace

现在我想printf用一个添加eq到以这种方式定义的链表的函数替换它:

typedef struct nodeTeam{
    int numberOfTeams;
    Team team;
    struct nodeTeam *next;
    struct nodeTeam *prev;
}NodeTeam;

所以我替换printfaddNodeTeamsSorted(headEquipas,&tailEquipas,eq);

fgets(buffer, 100, equipas)!= NULL);
eq.name= strtok(buffer,";\n");
eq.teamPlace= strtok (NULL,";\n");

addNodeTeamsSorted(headEquipas,&tailEquipas,eq);

现在,如果我打印我的链表,我可以看到我的节点已添加但name包含teamPlace垃圾字符。但如果我这样做:

fgets(buffer, 100, equipas)!= NULL);
eq.name= "test";
eq.teamPlace= "test2";

addNodeTeamsSorted(headEquipas,&tailEquipas,eq);

我可以看到一切都按预期工作,这让我认为问题出char在我的struct

我究竟做错了什么?

4

2 回答 2

2

strtok对您在第一次调用中指定的缓冲区进行操作。buffer您需要复制字符串(strncpy()例如

于 2012-05-14T15:04:56.827 回答
2

您的问题是您的缓冲区是在堆栈上创建的,并且 strtok 的结果指向缓冲区。

当您从此函数返回或从缓冲区读取另一行时,堆栈(以及您的缓冲区)被重用于其他内容,并且您的指针指向的数据已被覆盖。常量字符串不会发生这种情况,因为它们位于静态内存区域而不是堆栈中。

尝试在 strtok() 的输出上使用函数 strdup() 并将它们保存到您的结构中;这会将 strtok() 返回的字符串复制到堆中,不会被意外覆盖。

于 2012-05-14T15:05:55.113 回答