[英]C add strtok to char*
我在使用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
正在按預期和存儲sometextdada
在eq.name
和othertextdata
在eq.teamPlace
現在我想用一個函數替換printf
,該函數將eq
添加到以這種方式定義的鏈表:
typedef struct nodeTeam{
int numberOfTeams;
Team team;
struct nodeTeam *next;
struct nodeTeam *prev;
}NodeTeam;
所以我用addNodeTeamsSorted(headEquipas,&tailEquipas,eq);
替換printf
addNodeTeamsSorted(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);
我可以看到一切都按預期工作,這使我認為問題是在我的struct
上字符串char
時
我究竟做錯了什么?
strtok
對您在第一次調用中指定的緩沖區進行操作。 而不是直接存儲返回的指針(指向buffer
,你在每行的處理中覆蓋),你需要復制字符串(例如strncpy()
)
您的問題是您的緩沖區是在堆棧上創建的,而strtok的結果是指向緩沖區。
當您從此函數返回或從緩沖區中讀取另一行時,堆棧(以及您的緩沖區)將被重用於其他內容,並且指針指向的數據已被覆蓋。 常量字符串不會發生這種情況,因為它們位於靜態內存區域而不是堆棧中。
嘗試在strtok()的輸出上使用函數strdup()並將它們保存到您的結構中; 這會將strtok()返回的字符串復制到堆中,在那里它們不會被意外覆蓋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.