2009-10-02 6 views
11

私は入れ子になったループでstrtok()を使用しようとしています。しかし、これは私に望ましい結果を与えていません。 同じメモリロケーションを使用している可能性があります。私のコードの形式は次のとおりです。 -Cのループでstrtok()を使用していますか?

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

だから、今、あなたは、彼らはそれを避けることができれば、人々は 'のstrtok()を'使用しない理由を知っています。正しく使用するのは難しいです。 –

答えて

19

はい、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" */ 
} 
+2

'strtok'がこのように動作している理由を編集しない場合は、' strtok_r'に関するいくつかの情報があります:http://www.mkssoftware.com/docs/man3/strtok_r.3.asp – Welbog

+0

@ ChrisF:問題はデリミタやトークンを格納する場所ではなく、むしろ 'strtok'がいつでも1つの文字列をトークンできるという事実です。 'strtok_r'は別のパラメータを使ってその状態を記録することでこの問題を解決します。 – Welbog

+0

誰かが上記のループの仕組みを説明できますか? – MortalMan

1

strtokはスタティックバッファを使用しています。 あなたの場合、strtok_rを使うべきです。この関数は、ユーザーが提供するバッファーを使用しています。

0

ウェインキングは、an alternativeをMicrosoft Developer Centerに投稿しました。

彼を引用:ここに行く

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

をして、このファイルをダウンロード

Stptok.Cはあなたにも必要な をダウンロードすることができ 機能

をトークン化の改善同じサイトのヘッダーファイル。

これは、構文解析されたトークン (部分文字列)を別のバッファに配置するstrtok の変更版です。 は、お客様のニーズに合わせて に変更する必要があります。

  • ウェイン

P.S. - これらのファイルは、行末に対して * nix形式であることに注意してください。すなわち - は0x0Aだけでなく 0x0Dを0x0Aの

お使いの環境では、Microsoftのライブラリを持っていない場合、これは代替手段です。

が、それは他の人の役に立てば幸い:)

関連する問題