掲示板利用宣言

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

 私は

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

掲示板2

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

No.24976

sscanf関数とstrtok関数について
投稿者---hagu(2005/12/26 22:26:42)


sscanf関数を使って、カンマ区切りのデータを取り出そうとして
います。

環境は、UNIXです。
Solaria8です。
コンパイラは、gccです。

内容は、
"A001,117,2,abcd,efgh,ijkl,mnop"
となっています。
フィールド1とフィールド3を取得しようとしているのですが
上手くいきません。
フィールド1しか取得されません。

sscanf(str,"%[^,]s,%*[^,],%d[^,],",id,&num);
sscanf(str,"%[^,]s,%*[^,],%[^,]d,",id,&num);
sscanf(str,"%[^,]s,%*[^,]s,%[^,]d,",id,&num)
とやってみたのですが。

#include <stdio.h>

main()
{
    char str[] ="A001,117,2,abcd,efgh,ijkl,mnop";
    char id[7];
    int num;
    int ret

    ret = sscanf(str,"%[^,]s,%*[^,],%[^,]d,",id,&num);
    printf("ret = [%d]\n",ret);

    printf("[%s][%d]\n",id,num);
}



strtok関数についてなのですが、strtokで切り出しを行ったあとの元の
文字列(左側に指定した文字列)を表示したのですが、すべて表示され
ず、トークンで切り出した文字列になっているのですが、どうしてなの
ですが、切り出しにより、ポインタがずれてしまっているのですか。
扱うには、どうしたらいいのですか。

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

main()
{
    char str[] ="A001,117,2,abcd,efgh,ijkl,mnop";
    char *p;
    char id[7];
    int num;

    p = strtok(str,",");
    strcpy(id,p);
    p = strtok(NULL,",");
    p = strtok(NULL,",");
    num = atoi(p);

    printf("id=[%s]\n",id);
    printf("num=[%d]\n",num);
    printf("str=[%s]\n",str);
}


id=[A001]
num=[2]
str=[A001] ← A001となってしまう。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:sscanf関数とstrtok関数について 24977 あかま 2005/12/26 22:47:56
<子記事> Re:sscanf関数とstrtok関数について 24979 まきじ 2005/12/26 23:29:38


No.24977

Re:sscanf関数とstrtok関数について
投稿者---あかま(2005/12/26 22:47:56)


こうじゃまいか。
sscanf(str,"%[^,]s,%*[^,],%d,",id,&num);

strtokは元の文字列を破壊します。
http://www9.plala.or.jp/sgwr-t/lib/strtok.html
使う時は事前に別の配列にコピーしておいて、そちらをstrtokにかけるといいでしょう。


この投稿にコメントする

削除パスワード

No.24979

Re:sscanf関数とstrtok関数について
投稿者---まきじ(2005/12/26 23:29:38)


> "A001,117,2,abcd,efgh,ijkl,mnop"
>フィールド1とフィールド3を取得しようとしているのですが

sscanf(str,"%[^,],%*d,%d",id,&num);


この投稿にコメントする

削除パスワード

No.24982

Re:sscanf関数とstrtok関数について
投稿者---hagu(2005/12/27 00:10:18)


あかまさん、まきじさんありがとうございます。

strtokは元の文字列を破壊します。
そうなんですか。

「%[^,]s,」を「「%[^,],」と上手く行くのですか。
そういうものですか。




この投稿にコメントする

削除パスワード

No.24986

Re:sscanf関数とstrtok関数について
投稿者---まきじ(2005/12/27 12:42:27)


>「%[^,]s,」を「「%[^,],」と上手く行くのですか。
>そういうものですか。

s などの代わりに [^,] と指定するものです。

>sscanf(str,"%[^,]s,%*[^,],%[^,]d,",id,&num);

2 個目は数値だけなら %*d でも良いですよ。
3 個目は数値しか読み込まないので [^,] は不要ですね。


この投稿にコメントする

削除パスワード

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