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保存されているsometextdadaことeq.nameがわかりますothertextdataeq.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 に答える