入力変換指定子

sscanf、vsscanf、scanf などの関数では、% を使用して、入力するデータの書式を指定します。たとえば、次のようになります。
char a[10];
int i, j; long li;
float f; double d;
sscanf( "ABC", "%s", a ); // a[]="ABC"
sscanf( "ABC", "%2s", a ); // a[]="AB"
sscanf( "ABC", "%c", a ); // a[0]='A'
sscanf( "ABC", "%2c", &a ); // a[0]='A', a[1]='B'
sscanf( "123", "%d", &i ); // i=123
sscanf( "123", "%2d", &i ); // i=12
sscanf( "1,2", "%d,%d", &i, &j ); // i=1, j=2
sscanf( "123", "%ld", &li ); // li=123
sscanf( "314e-2", "%f", &f ); // f=3.14
sscanf( "314e-2", "%lf", &d ); // d=3.14
sscanf( "AAABBC", "[AB]", a ); // a="AAABB" (簡易正規表現)

入力変換指定子の構文は、次のとおりです。

%[*][width][modifier]type

入力変換指定子の構文は、多くの点で出力変換指定子を同じです。 modifiertype により、sscanf 関数などの引数に指定する変数の型が決まります。次はその例です。

指定
d,i,u,x int* または unsigned*
ld,li,lu,lx long* または unsigned long*
f,e,g float*
lf,le,lg double*
c,s char*
C,S wchar_t*
n int*
p void**
Fp void far**
Np void near**
Fd int far*
Nd int near*

* (アスタリスク)

% の直後に * を指定すると、そのデータは、変数に格納されずに読み飛ばされます。この場合、対応するアドレスを scanf などの引数に渡す必要はありません。
int i;
sscanf( "1,2,3", "%*d,%*d,%d", &i ); // i=3

width (出力幅)

入力データの最大バイト数を 10 進文字列で指定します。typep の場合は無視されます。
int a, b, c;
sscanf( "12345", "%1d%2d%3d", &a, &b, &c ); // a=1, b=23, c=45

modifier (修飾子)

指定 説明
h type で整数を指定する場合に、引数が int ではなく short へのポインタであることを示します。Light C では int と short が同一なので、効果はありません。
l type が整数の場合は引数が int ではなく long へのポインタであることを示し、type が小数の場合は引数が float ではなく double へのポインタであることを示します。
L type で小数を指定する場合に、引数が long double 型であることを示します。Light C では long double と double が同一なので、効果はありません。
F 引数が far ポインタであることを示します。ただし、type が p の場合は、引数でポイントされるポインタが far であることを示します。
N 引数が near ポインタであることを示します。ただし、type が p の場合は、引数でポイントされるポインタが near であることを示します。

type (型)

文字列をどのような種類の値として解釈するかを指定します。

指定 解析される文字列の構文 説明
d, i [+|-]ddd 文字列を符号付き 10 進数として解析し、結果を (long) int に格納します。
u [+]ddd 文字列を符号なし 10 進数として解析し、結果を (unsigned long) int に格納します。
X, x [+][0x|0X]hhh 文字列を 16 進数として解析し、結果を (unsigned long) int に格納します。文字列の先頭に 0x または 0X が付いていてもかまいません。
o [+]ddd 文字列を 8 進数として解析し、結果を (unsigned long) int に格納します。
q [+]ddd 文字列を 4 進数として解析し、結果を (unsigned long) int に格納します。[LC]
b [+]ddd 文字列を 2 進数として解析し、結果を (unsigned long) int に格納します。[LC]
p hhh または hhh:hhh ポインタ値の表現を読み込みます。small/medium モデルの場合と、modifierN を指定した場合は、4 桁以下の 16 進数を入力し、near ポインタとして格納します。そうでない場合は、4 桁以下の 16 進数、コロン (:)、および 4 桁以下の 16 進数を順に入力し、far ポインタとして格納します。
s [^ \t\n\v\f\r]... ホワイトスペース以外のバイトを連続して入力し、末尾に 0 を付加して、結果を char [ ] に格納します。
c (任意の n バイト) 1 バイトを入力し、結果を char に格納します。width を指定した場合は、そのバイト数分のデータを連続して入力し、結果を char [ ] に格納します。
S [^ \t\n\v\f\r]... s と似ていますが、結果を wchar_t [ ] に格納する点が異なります。
C c と似ていますが、結果を wchar_t または wchar_t [ ] に格納する点が異なります。
f,e,g,E,G [+|-][ddd][.ddd][{E|e}ddd] 文字列を小数として解析し、結果を float または double に格納します。
n これまでに入力したバイト数を int に格納します。

cC 以外では、入力データ先頭のホワイトスペースは読み飛ばされます。

参照   出力変換指定子