【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18465

strtokのループ処理について
投稿者---アッキ(2004/12/01 11:00:46)


以下の3行のプログラムをループすると
1度目はatai2を正常取得(aaa,bbb,cccをカンマ区切りしたもの)
できるのですが、2度目はatai2にaaaしか入りません。
strtokに使用した変数の初期化の仕方に問題があるのでしょうか?
どなたか分かりましたらご教授いただけますようお願いいたします。

atai2 = NULL;
atai1 ="aaa,bbb,ccc";
atai2 = strtok(atai1, ",");



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:strtokのループ処理について 18466 επιστημη 2004/12/01 11:08:45
<子記事> Re:strtokのループ処理について 18467 nop 2004/12/01 11:35:50


No.18466

Re:strtokのループ処理について
投稿者---επιστημη(2004/12/01 11:08:45)


>以下の3行のプログラムをループすると
>1度目はatai2を正常取得(aaa,bbb,cccをカンマ区切りしたもの)
>できるのですが、2度目はatai2にaaaしか入りません。

マニュアルは読みましたか?

--- NSDNより ---
次のトークンを読み取るには、引数 strToken に NULL 値を指定して strtok 関数を呼び出します。引数 strToken に NULL を指定すると、strtok 関数は、変更された strToken で次のトークンを検索します。区切り文字のセットを変更できるように、引数 strDelimit には呼び出しごとに任意の値を指定できます。
---------------

char* buffer = "aaa,bbb,ccc";
char* input;
char* token;
for ( input = buffer; (token = strtok(input,",")) != NULL; input = NULL ) {
...
}



この投稿にコメントする

削除パスワード

No.18468

Re:strtokのループ処理について
投稿者---アッキ(2004/12/01 11:43:41)


早速のご回答どうもありがとうございます。
説明不足で申し訳ありませんでした。
下記処理をループで行ったときに
i=0のときは変数tokenにaaa bbb cccと正常な値を取得できますが
i=1のときはtokenにaaaしか取得できません。(変数bufferにaaaしか入らないようです)
度々すみませんがよろしければ回避策をご回答いただけますようお願いいたします。

for (i = 0; i < 10; i++);

char* buffer = "aaa,bbb,ccc";
char* input;
char* token;
for ( input = buffer; (token = strtok(input,",")) != NULL; input = NULL )
{
....
}
}


この投稿にコメントする

削除パスワード

No.18469

Re:strtokのループ処理について
投稿者---επιστημη(2004/12/01 12:02:32)


>i=0のときは変数tokenにaaa bbb cccと正常な値を取得できますが
>i=1のときはtokenにaaaしか取得できません。(変数bufferにaaaしか入らないようです)

だから、マニュアルを読みましたか?
strtokは入力となった文字列を'破壊'します。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
  int i;
  for (i = 0; i < 10; i++) {
    const char* original = "aaa,bbb,ccc";
    char* buffer = (char*)malloc(strlen(original)+1);
    char* input;
    char* token;
    for ( input = strcpy(buffer,original); 
          (token = strtok(input,",")) != NULL;
          input = NULL ) {
      printf("[%s] ", token);
    }
    putchar('\n');
    free(buffer);
  }
  return 0;
}





この投稿にコメントする

削除パスワード

No.18470

Re:strtokのループ処理について
投稿者---アッキ(2004/12/01 15:11:11)


丁寧なご説明どうもありがとうございました。



この投稿にコメントする

削除パスワード

No.18467

Re:strtokのループ処理について
投稿者---nop(2004/12/01 11:35:50)


>atai1 ="aaa,bbb,ccc";
>atai2 = strtok(atai1, ",");

まず、文字リテラルを変更しないように!


# strtok() は、第一引数で与えられたバッファの内容を変更します。
# よって、文字列リテラルへのポインタを渡さないようにしましょう。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧