2012年7月2日月曜日

日記ちゃんsscanf_s

_stscanf_sがなんか意図した動作しねえなあとおもったら、
C言語のsscanfとはけっこう使い方が違うらしいと、調べてわかった。
scanf 関数の型フィールド文字 (CRT)

int a, b, c;
_stscanf_s( _T("123456789"), _T("%02d%04d%03d"), &a, &b, &c );

 は動くが、

short a, b, c;
_stscanf_s( _T("123456789"), _T("%02d%04d%02d"), &a, &b, &c );

 だと死ぬ。これはまあ想像つくが%dではなく%hdにする必要がある。

short a, b, c;
_stscanf_s( _T("123456789"), _T("%02hd%04hd%02hd"), &a, &b, &c );



int a, b, c;
TCHAR str[ 4 ] = {0};
_stscanf_s( _T("123456789abc"), _T("%02d%04d%02d%3s"), &a, &b, &c, str );

 これが動かない。というか動くけど読み取らない。

int a, b, c;
TCHAR str[ 4 ] = {0};
_stscanf_s( _T("123456789abc"), _T("%02d%04d%02d%3s"),
    &a, &b, &c, str, sizeof(str)/sizeof(*str) );

 とすれば動く。%sを使う場合、サイズ指定をする必要があるらしい。
さらに、

int a, b, c;
TCHAR str[ 4 ] = {0};
_stscanf_s( _T("123456789abc"), _T("%02d%04d%02d%3s"),
    &a, &b, &c, str, sizeof(str)/sizeof(*str)-1 );

 とすると動かなくなる。ややこしい!
%3で3文字読み込むが、バッファは4-1の3でさらにNULLが入ることを考慮すると実質2文字分になる。
指定文字数を読み取れるだけのバッファがないと読み取ろうともしなくなるようだ。
%sはNULL文字がつくから-1する必要は特にないだろうけど。

int a, b;
TCHAR str[ 4 ] = {0};
TCHAR str2[ 4 ] = {0};
_stscanf_s( _T("123456789abc"), _T("%2d%3s%2d%2s"),
    &a, str, sizeof(str)/sizeof(*str), &b, str2, sizeof(str2)/sizeof(*str2) );

 だと問題ないが、

int a, b;
TCHAR str[ 4 ] = {0};
TCHAR str2[ 4 ] = {0};
_stscanf_s( _T("123456789abc"), _T("%2d%4s%2d%2s"),
    &a, str, sizeof(str)/sizeof(*str), &b, str2, sizeof(str2)/sizeof(*str2) );

 だと最初の%2dのみ読む。
%4sはバッファが5文字分いるが4しか確保していないため。

0 件のコメント: