2009-08-14 12 views
0
私はこの非常に奇妙な行動来てい

:以下のコードではstrtok関数呼び出し

を:私はMyLoggerへの呼び出しをコメントする場合は、すべてが正常に動作しているが、私はsTempNrがトークン化を取得し、4つのトークンが印刷されます。 しかし、MyLoggerへの呼び出しをコメント解除してロギングを行うと、繰り返しは1回だけ実行され、他のテストクラスでは、以下のようなコードでMyLoggerに冗長な情報が送られてループが4回以上発生します。

そこで、PurifyツールでMyLoggerにメモリの問題がないかどうかを調べました。 何も見つかりませんでした。 MyLoggerはvaargsを使ってargsとvfprintfを呼び出してprintを呼び出しています。

このコードをさらにデバッグする方法がわかりません。どのような指導もいただければ幸いです。

char sTempNr[41] = "1129Z13589.2.9.10"; 
char *sTempStr; 
sTempStr = NULL; 

sTempStr = strtok(sTempNr,"."); 
while (sTempStr) 
{ 
    printf("in in TempStr[%s]\n",sTempStr); 
     //MyLogger("write","","Temp String[%s]",sTempStr); 

    sTempStr = strtok(NULL,"."); 
} 

答えて

10

strtok()は、おそらくMyLoggerの中にいくつかの静的データを保持しています。strtok()を直接的または間接的に呼び出します。

この問題を回避するには、strtok()strtok_r()(再入可能版strtok())に置き換えてください。

+4

を変更した場合参照)、それは任意のツールとC. –

+0

@デビッド同様程度非常識なものであると考えて - あなたの場合不注意にあなた自身(または他人)を傷つけますが、決してツールを使用すべきではありません。 – qrdl

+3

彼はそうです。 strtok()の問題は「不注意」なユーザとは無関係であり、完全に悪いライブラリ設計に限られています。 –

1

ロガーはstrtokを呼び出していますか?

1

MyLoggerもstrtokを使用していますか? strtokはステートレスではありません。

-1

MyLoggerのようなサウンドは、sTempStrの文字列を壊しています。 MyLoggerを呼び出した後、もう一度印刷してみてください。例えば

printf("in in TempStr[%s]\n",sTempStr); 
MyLogger("write","","Temp String[%s]",sTempStr); 
printf("in in TempStr[%s]\n",sTempStr); 

、何が、なぜ私は、今までに、(はstrtokを使用したことがないです

+0

それがあっても、次のstrtok()の呼び出しでsTempStrが再割り当てされても問題ありません。 – qrdl