2017年2月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28        

Amazonウィジェット

  • miniPC
  • 最近買った本
  • Raspberry Pi
  • クアッドコプター
  • 書籍ランキング

AdSense

  • 広告
無料ブログはココログ

« C言語 可変長引数の使いかた | トップページ | C言語 関数ポインタを使って遊ぶ »

2016年10月16日 (日)

C言語 sscanfの続きとvsscanfとの違い。それぞれの使いどころ

前回の記事でsscanfを使って文字列の読み込みをやりました。今日はもう少しsscanfを使ったテクニックを掘り下げます。

scanf、sscanfのほかに、vsscanfというのがあるのですが、これは可変長引数が受け取れるようになっています。可変長引数というのは、引数を何個でも受け取れるということ。しかしどこで使えばいいのか。一見sscanfとの違いがわからずもやもやしてしまいました。

以下、vsscanfを使ったときのメモです。

下記のような3種類のログがファイルの中に行毎に混ざって存在しているとする。

"channels  ,0(0),1(3),2(?),3(-),4(R),5(-)"
"answers   ,ss,0,sd,2,us,1"
"handles    ,-10         ,10         ,102    "

ログを読むための書式文字列は下記のようになった。読んだ後の値は構造体や配列に入れる。

int ret = sscanf(buff, "%10s ,%10d ,%10d ,%10d"
                     ,enc.name,&enc.left,&enc.right,&enc.time);
char ch[6];
int ret = sscanf(buff, "%s ,0(%c),1(%c),2(%c),3(%c),4(%c),5(%c),"
              , enc.name, &ch[0], &ch[1], &ch[2], &ch[3], &ch[4], &ch[5]);
       int res[3];
       char name[32];

       int ret = sscanf(buff, "%s ,2d,%d,3d,%d,us,%d"
              , name,&res[0],&res[1],&res[2]);

vsscanfを使うには可変長引数の使い方についての知識が必要で、それを使うにはstdarg.hをインクルード下上で、下記のようなラップ関数を用意する必要がある。そのラップ関数に書式文字列と、入れ物のアドレスを渡して使う。

//書式を指定してレコードを読みこむ
void input_vsscanf(char *s, char *format, ...){
	va_list argv;

	va_start(argv, format);
	vsscanf(s, format, argv);
	va_end(argv);

	return 0;
}

//この関数からvsscanfのラップ関数を呼び出す
void logReader(char *str){
	if (NULL != strstr(str, "answers")){
		input_vsscanf(str, "%s ,2d,%d,3d,%d,us,%d"
			, name
			, &result_log.res_ss, &result_log.res_sd, &result_log.res_us);
	}
}

やっているうちにvsscanfの強みには気がついたものの、引数については相変わらず一個ずつ指定しないといけないので、いい使い方例を書くまでにはいたりませんでした。今のところ用途は無いのです が、書式文字列を変えることによって、読み込みたい値が書いてある場所を任意に指定するとか。たとえば、同じ情報が書かれたログだけれど書式がちょっとず つ違っていて、そういうときに場合分けして読みたいとか。そういう用途なのかと思っていました。

追記
vsscanf以外のvprintfや他の関数についてみていたら、どうやらデバッグ用関数を作るときに有用なことがわかりました。たとえば読み込んだ文字列から値を取り出すと同時に、ファイルに書き出すとかUDPでどこかへ転送するとか。そういうデバッグ用関数を作るときに使えそうです。

今日のところはここまで。

« C言語 可変長引数の使いかた | トップページ | C言語 関数ポインタを使って遊ぶ »

C言語」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/518723/64287803

この記事へのトラックバック一覧です: C言語 sscanfの続きとvsscanfとの違い。それぞれの使いどころ:

« C言語 可変長引数の使いかた | トップページ | C言語 関数ポインタを使って遊ぶ »