1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

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

No.5660

文字列分割の方法
投稿者---たっちゃん(2006/04/30 20:22:23)


文字列分割について教えてください。
例えば、テキストファイルに100,50,60,80,70というような形でデータが入っている場合。
このデータをカンマで区切って取り出したいのですが、どのようにすれば良いのでしょうか。いろいろと試してみたのですが、うまくいかないのでご存知の方教えてください。
よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列分割の方法 5661 iijima 2006/04/30 21:17:43
<子記事> Re:文字列分割の方法 5665 かずま 2006/04/30 23:14:33


No.5661

Re:文字列分割の方法
投稿者---iijima(2006/04/30 21:17:43)


> いろいろと試してみたのですが、

strtok関数は試しましたか?
まだでしたら、strtok関数を試すことをお勧めします。

# なにをどう試してどううまくいかなかったかを説明しないと、
# 的確な回答は得にくいですよ。



この投稿にコメントする

削除パスワード

No.5662

Re:文字列分割の方法
投稿者---たっちゃん(2006/04/30 21:40:02)


># なにをどう試してどううまくいかなかったかを説明しないと、
># 的確な回答は得にくいですよ。

説明不足で申し訳ありませんでした。
strtok関数を使おうと思っていろいろと調べてみました。
例えばchar str[] = "C/C++,Java, PHP"; といった形での使い方はわかったのですが、ファイルから入力した文字列の場合、実際どのように記述すれば良いのでしょうか。
私の力不足でこれ以上どうしてもわからなかったので、アドバイスお願いします。






この投稿にコメントする

削除パスワード

No.5663

Re:文字列分割の方法
投稿者---shu(2006/04/30 21:59:25)


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

//
//
int main( void )
{
    char s[256];
    
    //
    scanf( "%s", s );
    
    //
    strtok( s, "," );
    strtok( NULL, "," );
    strtok( NULL, "," );
    strtok( NULL, "," );
    strtok( NULL, "," );
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.5664

Re:文字列分割の方法
投稿者---iijima(2006/04/30 22:42:34)


> char str[] = "C/C++,Java, PHP"; といった形での使い方はわかった

ファイルから読み込んだ文字列だろうがなんだろうが、strtok関数の使い方は同じです。
例えば、次のように考えてみてはいかがでしょうか。

(1)ファイルを開く
(2)ファイルから1行読み込む
(3)その1行を分割する
※ファイルに複数行のデータがあるなら、データがなくなるまで(2)(3)を繰り返す
(4)ファイルを閉じる


この投稿にコメントする

削除パスワード

No.5666

Re:文字列分割の方法
投稿者---たっちゃん(2006/04/30 23:35:35)


アドバイスありがとうございます。
参考に作ってみたのですが、うまくいきません。どこが間違っているのかご指摘ください。

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

//
//
int main( void )
{
    FILE *fp;
    char s[100];
    char *token;
    char data[10];
    int count = 0;

    
    fp = fopen ("data.txt","r");
    fgets (s, 100, fp);
    fclose(fp);
    
    token = strtok(s,",");
    while (token != NULL)
    {
        data[count] = token;
         token = strtok(NULL,",");
          count++;
    }

    printf ("%s\n",data[0]);
    printf ("%s\n",data[1]);
    printf ("%s\n",data[2]);
    return 0;
}



この投稿にコメントする

削除パスワード

No.5667

Re:文字列分割の方法
投稿者---YuO(2006/05/01 01:44:18)


>参考に作ってみたのですが、うまくいきません。どこが間違っているのかご指摘ください。

・どのようになればうまくいったのか
・どのようになったのでうまくいかなかったのか
この2点の説明がありません。
それが一番間違っています。


とりあえず,
    char *token;
    char data[10];

なのに,
        data[count] = token;

とか,
    printf ("%s\n",data[0]);
    printf ("%s\n",data[1]);
    printf ("%s\n",data[2]);

とかは問題があります。
tokenの型や,data[count]の型をちゃんと考えてみてください。



この投稿にコメントする

削除パスワード

No.5668

Re:文字列分割の方法
投稿者---iijima(2006/05/01 09:56:30)


仕様(どのようなデータを読んで、どのような出力をさせるのか)の説明がありませ
んが、ソースより、コンマ区切りの文字列を1行読み、コンマで分割して文字列の配
列dataに格納したいのだと推測しました。

以下は、この推測が正しいと仮定しての話です。

1.
    char data[ 10 ];

これはchar型の配列であって文字列の配列にはなりません。
文字列の配列にしたいのであれば、例えば、

    char data[ 10 ][ 32 ];

のように2次元配列にする必要があります。
もちろん、1個の文字列の文字数の上限値(上の例では末尾の'\0'を含めて32文字)
については要検討です。

2.
    data[ count ] = token;

これだと、文字列tokenの先頭を指すポインタの値をdata[ count ]に代入することに
なります。
意図的にそのような処理をすることもないことはありませんが、普通はstrcpy関数で
コピーします。

   strcpy( data[ count ], token );

3.
    while( token != NULL ){ ... }

dataの要素数が10個と固定なので、ファイルにあるデータの数が10個を超える場合に
問題が起こります(data配列で用意したメモリ領域を超えて書き込もうとする)。
dataの要素数が10個を超えないような措置が必要です。
例えば、

    while( token != NULL && count < 10 ){ ... }

など。



この投稿にコメントする

削除パスワード

No.5665

Re:文字列分割の方法
投稿者---かずま(2006/04/30 23:14:33)


ファイルのオープンは省略しましたので、自分で書くか、
リダイレクトで標準入力をファイルに切り換えてください。
#include <stdio.h>

int main(void)
{
    int data;  FILE *fp = stdin;

    while (fscanf(fp, "%d%*c", &data) == 1)
        printf("%d\n", data);
    return 0;
}



この投稿にコメントする

削除パスワード

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





掲示板提供:(有)リアル・インテグリティ