14

ネストされたループで使用しようとしてstrtok()いますが、同じメモリ位置を使用している可能性があるため、望ましい結果が得られません。私のコードは次の形式です:-

char *token1 = strtok(Str1, "%");
while (token1 != NULL)
{
    char *token2 = strtok(Str2, "%");
    while (token2 != NULL)
    {
        //Do something
        token2 = strtok(NULL, "%");
    }
    // Do something more
    token1 = strtok(NULL, "%");
}
4

3 に答える 3

23

はい、strtok()確かに、呼び出し間のコンテキストを保存するために静的メモリを使用します。代わりに、またはVS(と同じ)を使用している場合はstrtok()、の再入可能なバージョンを使用してください。strtok_r()strtok_s()strtok_r()

追加のコンテキスト引数があり、さまざまなループでさまざまなコンテキストを使用できます。

char *tok, *saved;
for (tok = strtok_r(str, "%", &saved); tok; tok = strtok_r(NULL, "%", &saved))
{
    /* Do something with "tok" */
}
于 2009-10-02T13:57:21.887 に答える
2

strtokは静的バッファを使用しています。あなたの場合、strtok_rを使用する必要があります。この関数は、ユーザーが提供するバッファーを使用しています。

于 2009-10-02T14:01:59.457 に答える
1

WayneAKingは、MicrosoftDeveloperCenterに代替案を投稿しました。

彼を引用する:

ここに行く

http://cpp.snippets.org/code/

このファイルをダウンロードしてください

stptok.c トークン化機能の改善

同じサイトから必要なヘッダーファイルをダウンロードすることもできます。

これは、解析されたトークン(サブストリング)を別のバッファーに配置するstrtokの修正バージョンです。ニーズに合わせて変更できるはずです。

  • ウェイン

PS-これらのファイルは、行末に関して*nix形式である可能性があることに注意してください。つまり、-0x0Aのみで、0x0Dではありません0x0A

これは、ご使用の環境にMicrosoftライブラリがない場合の代替手段です。

于 2010-05-20T15:17:16.237 に答える