strtok関数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
虎ichi

strtok関数

#1

投稿記事 by 虎ichi » 14年前

学校の課題のプログラムを書く過程で、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;

}

アバター
a5ua
記事: 199
登録日時: 14年前

Re: strtok関数

#2

投稿記事 by a5ua » 14年前

コード:

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

non
記事: 1097
登録日時: 14年前

Re: strtok関数

#3

投稿記事 by non » 14年前

前のスレッドを、ほったらかしにするのは、マナーが悪いですね。
non

虎ichi

Re: strtok関数

#4

投稿記事 by 虎ichi » 14年前

ほったらかしにしてすみません。
ご指摘ありがとうございます。

コード:

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

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

non
記事: 1097
登録日時: 14年前

Re: strtok関数

#5

投稿記事 by non » 14年前

NULLとは数値でいうと0ですから、0番地からの内容をコピーするのでマズイです。
non

虎ichi

Re: strtok関数

#6

投稿記事 by 虎ichi » 14年前

コード:

#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;

}
こういうことですか?

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: strtok関数

#7

投稿記事 by みけCAT » 14年前

tp = strtok(tp, ",");

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

追記
今更ながら修正。あとに→間に
最後に編集したユーザー みけCAT on 2011年8月09日(火) 15:43 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

初級者
記事: 200
登録日時: 14年前

Re: strtok関数

#8

投稿記事 by 初級者 » 14年前

ふつうは、こういう風に書くんでしょうね、きっと。

コード:

#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;
}

虎ichi

Re: strtok関数

#9

投稿記事 by 虎ichi » 14年前

ありがとうございます!
while文の中身が逆でした。やっと意味がわかりました!

閉鎖

“C言語何でも質問掲示板” へ戻る