2011-01-30 14 views
1

は、私は、静的バッファ内のトークン化文字列を格納することができるstrokstrtokがトークン化に失敗しましたか?以下では

#include <string.h> 

void func(char *c) 
{ 
    char *pch = strtok (c,"#"); 

    while (pch != NULL) 
    { 
     pch = strtok (NULL, "#"); 
    } 
} 

int main() 
{ 
    char c[] = "a#a\nb#b\n"; 

    char *pch = strtok (c,"\n"); 

    while (pch != NULL) 
    { 
     char *p = new char[strlen(pch)+1]; 
     strcpy(p, pch); 

     func(p); //copy of pch 

     pch = strtok (NULL, "\n"); //fails to get pointer to 'b#b' 
    } 
} 

答えて

3

オム... strtok()を使用して作成するコピーせずに文字列を分割しようとしています。したがって、func()で第2のstrtok()が呼び出されると、(main()の)最初の操作の結果は失われているように見えます。 strtok_r()をご覧ください。

+1

サイドと(関連性のない)ノートでは、なぜCとC++のコードを混ぜるのか分かりません。 STLストリングを使用してライブラリを強化すると、あなたの人生を少し楽にすることができました。 –

+0

'strtok_r()'実装へのリンクを提供したいですか? – cpx

+0

@ Dave18:実際にはPOSIX.1-2001の一部なので、* NIX用のコードを書いているなら、既にそこにあります。そのマニュアルページを見てください。 Windows用にプログラミングしているなら、 'strtok_s()'がそこにあります:http://msdn.microsoft.com/en-us/library/ftsafwz3.aspx –

0

strtokは静的変数を使用するため、リエントラントでは動作できず、スレッドセーフではありません。 strtok_rはPOSIXのC89/C99ではありません。

関連する問題