• ベストアンサー

strtok()について

c言語にてstrtok()を使用しています。 以下の型をグローバル変数で宣言し、 (ヘッダ) typedef struct { char *pTmp; int len; } stAAA; (.cソース) stAAA stA; ある関数にてmalloc()によりstA.pTmpに動的に領域を割り当て、 "ABCDEFG:ABCDEFG:ABCDEFG:"という値を格納するとします。 その後他関数にてstA.pTmp内の":"をトークンとしstrtok()で 切り出す場合、stA.pTmpを切り出し後もアドレス移動させたく ないため strtok()使用関数にて以下のようにしたのですが・・・・ グローバル変数のアドレスが操作されてしまいます。 どうすればよいでしょうか?strtok()用にmalloc()する? int test(){ char *pTmp; char *pTok; pTmp = stA.pTmp; while ((pTok = strtok(pTmp, ":")) != NULL) { : : } }

質問者が選んだベストアンサー

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

strtok()が元の文字列を変更するかどうかについては実装依存ですが、文字列は何らかの変更を受けると思ったほうがよいでしょう。 文字列を元のまま残しておく必要があるなら、退避しておく必要があります。

その他の回答 (1)

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.1

まず、strtok 関数の使い方について見直してみましょう。 strtok は、最初に文字列のポインタを与えて、2度目以降は NULLを与えます。 pTok = strtok (stA.pTmp, ":"); while (pTok != NULL) {   :  pTok = strtok (NULL, ":"); } stA.pTmpが操作されることはないはずです。

sting
質問者

お礼

while実行後にprintf文にてstA.pTmp内を参照すると ABCDEFGしか出力されなくなってしまいます。

関連するQ&A