簡體   English   中英

C將strtok添加到char *

[英]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正在按預期和存儲sometextdadaeq.nameothertextdataeq.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);

現在,如果我打印我的鏈表,我可以看到我的節點已添加,但nameteamPlace包含垃圾字符。 但如果我這樣做:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM