ページ 11

strtok関数

Posted: 2011年8月08日(月) 17:34
by 虎ichi
学校の課題のプログラムを書く過程で、strtok関数を使って","区切りで配列に格納したいと考えてます。
今、例として"ABC,EFG,HIJ,KLM"を","区切りで配列に格納して出力するプログラムを書いて実行したのですが、
ABC
EFG
HIJ
KLM
となるはずのところが、セグメンテーション違反が出てしまいました。
どこがおかしいのでしょうか?
ご指摘お願いします。

コード:

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

int main(void)
{

  char str[] = "ABC,EFG,HIJ,KLM";
  char *tp;
  int i, count = 1;
  char str2[32][32];


  tp = strtok(str, ",");
  strcpy(str2[0], tp);

  while(tp != NULL)
    {
 
      tp = strtok(NULL, ",");
      strcpy(str2[count++], tp);
    }

  for(i = 0; i < 4; i++)
    {

        printf("%s\n", str2[i]);

    }

  return 0;

}

Re: strtok関数

Posted: 2011年8月08日(月) 17:51
by a5ua

コード:

while(tp != NULL)
{
	tp = strtok(NULL, ",");		// ここで、tpがNULLになると
	strcpy(str2[count++], tp);	// strcpyにNULLを渡すことになり、エラーとなる
}

Re: strtok関数

Posted: 2011年8月08日(月) 17:56
by non
前のスレッドを、ほったらかしにするのは、マナーが悪いですね。

Re: strtok関数

Posted: 2011年8月08日(月) 18:06
by 虎ichi
ほったらかしにしてすみません。
ご指摘ありがとうございます。

コード:

 tp = strtok(NULL, ",");
      strcpy(str2[count++], tp);
この部分をどのようにかえればいいのでしょうか?
strtok関数でいろんなサイトを見て
1回目は tp = strtok(str, ",");
2回目以降は tp = strtok(NULL, ",");

と書いてたのでそのまま引用しましたが、ただ単に出力するのとコピーするのは違うということなんでしょうか?

Re: strtok関数

Posted: 2011年8月08日(月) 18:29
by non
NULLとは数値でいうと0ですから、0番地からの内容をコピーするのでマズイです。

Re: strtok関数

Posted: 2011年8月08日(月) 18:46
by 虎ichi

コード:

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

int main(void)
{

  char str[] = "ABC,EFG,HIJ,KLM";
  char *tp = ;
  int i, count = 0;
  char str2[32][32];


  tp = str;

  while(tp != NULL)
    {
 
      tp = strtok(tp, ",");
      strcpy(str2[count++], tp);
    }

  for(i = 0; i < 4; i++)
    {

        printf("%s", str2[i]);

    }

  return 0;

}
こういうことですか?

うーん・・・わかるようでわかりません><

Re: strtok関数

Posted: 2011年8月08日(月) 18:47
by みけCAT
tp = strtok(tp, ",");

strcpy(str2[count++], tp);
の間にtpがNULLでないかの判定を入れないといけないと思います。

追記
今更ながら修正。あとに→間に

Re: strtok関数

Posted: 2011年8月08日(月) 21:33
by 初級者
ふつうは、こういう風に書くんでしょうね、きっと。

コード:

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

int main(void)
{
    char str[] = "ABC,EFG,HIJ,KLM";
    char str2[32][32];
    char *tp;
    int i, count = 0;

    tp = strtok(str, ",");
    while (tp) {
        strcpy(str2[count++], tp);
        tp = strtok(NULL, ",");
    }

    for (i = 0; i < count; i++) {
        printf("%s\n", str2[i]);
    }
    return 0;
}

Re: strtok関数

Posted: 2011年8月09日(火) 15:41
by 虎ichi
ありがとうございます!
while文の中身が逆でした。やっと意味がわかりました!