C言語関係掲示板

過去ログ

No.1260 sscanfの書式

[戻る] [ホームページ]
No.16638

sscanfの書式
投稿者---チェリーC(2004/09/07 15:41:11)


いつもお世話になります。
sscanfの書式についてわからないところがあったので
教えてください。
以下のsscanf内のこの部分です。
%15[^\t]\t%d\t%3[^\t]
この部分はどう解釈すればよいのでしょうか?

int main(void)
{
       char str[] = "Taro\t89\tA";
       char name[16] = "\0";
       int point = 0;
       char grade[4] = "\0";

       sscanf(str, "%15[^\t]\t%d\t%3[^\t]", name, &point, grade);
       printf("%s, %d, %s\n", name, point, grade);

       return 0;
}




No.16639

Re:sscanfの書式
投稿者---tetrapod(2004/09/07 16:50:47)


ココの scanf の説明ページには出てませんね。
scanf/sscanf のマニュアルを読みましょう。

だけだと不親切っぽいので

%[] は %s と同様、文字列を読み取ります。ただし %s と違い、
・空白類文字での読み取り終了は行われません。
・[ で始まる場合、[]内部に指定した文字種類の繰り返しを読み取ります
 []に指定されない文字が現れたらそこで読み取り終了です。
・[^で始まる場合、[]内部に指定した文字種類以外の繰り返しを読み取ります。
 []に指定された文字が現れたらそこで読み取り終了です。

よって %[^\t]は \t つまりタブ文字以外を読み取り、タブ文字が現れたら終了です。

% に続く数字は「最大読み取り文字数」です。 %15s だと最大15文字まで読み取り。
%15[] も同じ事です。
元文字列の最大15文字を処理するので、読み出し先文字列には
自動的に付加される \0 を含むことができるように 16byte 以上が必要です。

%d 等は大丈夫ですよね?



No.16640

Re:sscanfの書式
投稿者---チェリーC(2004/09/07 17:42:46)


ご返答ありがとうございます。
ただいまいちまだわからない部分があるので教えてください。

%15[^\t]\t%d\t%3[^\t]の

%15[^\t]→nameにTaro
%d→pointに89
3[^\t]→gradeにA

だと思うのですが、間に入っている\tは
どのような働きをしているのでしょうか?
すみませんが教えてください。

int main(void)
{
       char str[] = "Taro\t89\tA";
       char name[16] = "\0";
       int point = 0;
       char grade[4] = "\0";

       sscanf(str, "%15[^\t]\t%d\t%3[^\t]", name, &point, grade);
       printf("%s, %d, %s\n", name, point, grade);

       return 0;
}



No.16643

Re:sscanfの書式
投稿者---Sciggepy(2004/09/07 19:09:00)


「読み取り位置を一文字進める。」でしょう。制御文字以外は、それだけの意味しかありません。



No.16644

Re:sscanfの書式
投稿者---tetrapod(2004/09/07 19:27:38)


より正確には、
フォーマット文字列中の空白類文字(スペース、改行、タブ等)は、
対象文字列中の0文字以上の空白類文字にマッチします。
です。1文字とは限りません。

\t もスペースも空白類なので、この例題中、フォーマット文字列中の[]の外の\tは
スペースであっても同じ動きをします。

対象文字列を
"Taro Yamada\t \t\t10 \t\t\tAB CD \tEF"
にしたらどうなるかを見てみると理解できそうです。

ちなみに %d は数値文字に先行する空白類文字を読み捨てるので
\t%d の \t は無意味です。無くても同じ動きをします。