sscanf


書式付き入力を行います。

[所属]

標準ライブラリ

[指定形式]

#include <stdio.h>

int sscanf(const char *s, const char *format[, arg, ...]);

[戻り値]

走査,変換,格納が正常に実行できた入力フィールドの個数を返します。返却値には,格納されなかった走査済みフィールドは含まれません。ファイルの終わりで読み込もうとした場合,返却値はEOFです。フィールドが格納されなかった場合は,返却値は0です。

[詳細説明]

formatの指す文字列で指定された書式に従い,その後ろに続く引数argを,変換された入力を格納するオブジェクトを指すポインタとして扱い,sの指す配列から変換する入力を読み込みます。

formatには,認識されうる入力列,および“代入のためにどのように変換を行うか”ということを指定します。formatに対し十分な引数が存在しない場合,その動作は不定となります。引数が残っているのにformatが使い果たされた場合,残された引数は無視されます。

formatは,次に示す3種類のディレクティブにより構成されます。

1個以上の空白類

スペース( ),タブ(\t),改行(\n)です。

本関数を実行して,文字列内に空白文字が見つかった場合,次の空白でない文字まで連続するすべての空白文字を読み込みます(格納はしません)。

通常の文字

“%”以外のすべてのASCII文字です。

本関数を実行して,文字列内に通常の文字が見つかった場合,それを読み込みますが,格納はしません。変換指示により,本関数は,入力フィールドから文字列を読み込み,特定の型の値に変換し,引数で指定した位置に格納します。変換指示で明示されて一致しているのでなければ,後ろに続く空白は読み込まれません。

変換指示

0個以上の引数を取り込み,変換の指示を与えます。

 

各変換指示は“%”で始まります。“%”の後ろは,次のようになります。

 

%[代入抑制文字][フィールド長][サイズ][型指定文字]

 

それぞれの変換指示について,次に説明します。

(1)

代入抑制文字

入力フィールドの解釈,および代入を抑制する“*”です。

(2)

フィールド長

最大フィールド長を規定する0以外の10進整数です。入力フィールドを変換する前に読み込まれる最大文字数を指定します。入力フィールドがこのフィールド長より小さい場合,本関数はフィールド内のすべての文字を読み込み,次のフィールドとその変換指示へ進みます。また,フィールド長分を読み込む前に,空白文字,または変換できない文字が見つかった場合,その文字までの文字群を読み込み,変換し,格納します。その後,本関数は次の変換指示へ進みます。

(3)

サイズ

対応する引数のデータ型を解釈するデフォルトの方法を変更する,任意選択のサイズ文字h,l,ll,およびLです。

hを指定した場合,後ろに続くd,i,n,o,u,xの型指定を強制的にshort int型に変換し,short型で格納します。c,e,f,n,p,s,D,I,O,U,Xでは,何もしません。

lを指定した場合,後ろに続くd,i,n,o,u,xの型指定を強制的にlong int型に変換し,long型で格納します。e,f,gでは,強制的にdouble型に変換し,double型で格納します。c,n,p,s,D,I,O,U,Xでは,何もしません。

llを指定した場合,後ろに続くd,i,o,u,x,Xの型指定を強制的にlong long型に変換し,long long型で格納します。他の型指定では,何もしません。

Lを指定した場合,後ろに続くe,f,gの型指定を強制的にlong double型に変換し,long double型で格納します。他の型指定では,何もしません。

これら以外の場合,その動作は不定です。

(4)

型指定文字

適用される変換の型を指定する文字です。変換の型を指定する文字とその意味を次に示します。

%

文字“%”にマッチします。変換も代入も行われません。変換指示は“%%”となります。

c

1文字を走査します。対応する引数は“char *arg”にしてください。

d

10進整数を対応する引数に読み込みます。対応する引数は“int *arg”にしてください。

e,f,g

浮動小数点数を対応する引数に読み込みます。対応する引数は“float *arg”に,サイズ指定lを指定した場合は“double *arg”にしてください。

i

10進,8進,または16進整数を対応する引数に読み込みます。対応する引数は“int *arg”にしてください。

n

対応する引数に読み込んだ文字の個数を格納します。対応する引数は“int *arg”にしてください。

o

8進整数を対応する引数に読み込みます。対応する引数は“int *arg”にしてください。

p

走査したポインタを格納します。これは処理系定義です。

CC-RHでは,%pを%Uとまったく同じように処理しています。対応する引数は“void **arg”にしてください。

s

与えられた配列の中に文字列を読み込みます。対応する引数は“char arg[ ]”にしてください。

u

符号なし10進整数を対応する引数に読み込みます。対応する引数は“unsigned int *arg”にしてください。

x,X

16進整数を対応する引数に読み込みます。対応する引数は“int *arg”にしてください。

D

10進整数を対応する引数に読み込みます。対応する引数は“long *arg”にしてください。

E,F,G

浮動小数点数を対応する引数に読み込みます。対応する引数は“float *arg”に,サイズ指定lを指定した場合は“double *arg”にしてください。

I

10進,8進,または16進整数を対応する引数に読み込みます。対応する引数は“long *arg”にしてください。

O

8進整数を対応する引数に読み込みます。対応する引数は“long *arg”にしてください。

U

符号なし10進整数を対応する引数に読み込みます。対応する引数は“unsigned long *arg”にしてください。

[ ]

空でない文字列を引数argで始まるメモリの中へ読み込みます。この領域には,文字列と,自動的に付加される,文字列の終わりを示すnull文字(\0)とを受け入れられる大きさが必要です。対応する引数は“char *arg”にしてください。

[ ]で囲まれた文字パターンを,型指定文字sの代わりに使用することができます。文字パターンは,本関数の入力フィールドを構成する文字の検索セットを定義する文字集合です。[ ]内の最初の文字が“^”の場合,検索セットは反転され,[ ]内の文字以外のすべてのASCII文字が含まれます。また,ショートカットとして使用できる範囲指定機能もあります。たとえば,%[0-9]は,すべての10進数字と一致します。この集合内では,“-”は最初,または最後の文字にはできません。“-”の前の文字は,その後ろの文字よりも辞書式順序で小さくなるようにしてください。

 

-

%[abcd]
a,b,c,dのみを含む文字列と一致します。

-

%[^abcd]
a,b,c,d以外の任意の文字を含む文字列と一致します。

-

%[A-DW-Z]
A,B,C,D,W,X,Y,Zを含む文字列と一致します。

-

%[z-a]
z,-,aと一致します(範囲指定とはみなされません)。

 

浮動小数点数(型指定文字e,f,g,E,F,G)の場合,次の一般形式に対応させてください。

 

[ + | - ] ddddd [ . ] ddd [ E | e [ + | - ] ddd ]

 

ただし,上記の一般形式のうち[ ]で囲まれた部分は任意選択であり,dddは10進数字を表します。

[注意事項]

-

通常のフィールド終了文字に到達する前に,特定フィールドの走査を停止したり完全に終了したりする可能性があります。

-

次の状況では,その時点でのフィールドの走査,格納を停止し,次の入力フィールドに移動します。

-

代入抑制文字(*)が書式指定の中で“%”の後ろに現れており,その時点の入力フィールドは走査されているが格納はされていない。

-

フィールド長(正の10進整数)指定文字を読み込んだ。

-

読み込む次の文字がその変換指示では変換できない(たとえば,指示が10進のときにZを読み込む場合)。

-

入力フィールド内の次の文字が検索セット内に現れていない(または反転検索セット内に現れている)。

以上の理由からその時点の入力フィールドの走査を停止すると,次の文字が未読であるとみなされ,次の入力フィールドの最初の文字,またはその入力のあとの読み込み操作の最初の文字として使用されます。

-

本関数は,次の状況では終了します。

-

入力フィールド内の次の文字が変換する文字列内の対応する通常文字と一致していない。

-

入力フィールド内の次の文字がEOFである。

-

変換する文字列が終了した。

-

変換する文字列に変換指示の一部ではない文字の並びが含まれている場合,この同じ文字の並びは入力の中に現れないようにしてください。本関数は一致する文字を走査しますが,格納はしません。不一致があった場合,一致していない最初の文字は読み取られていなかったかのように入力の中に残っています。

[使用例]

#include    <stdio.h>
void func(void) {
    int         i, n;
    float       x;
    const char  *s;
    char        name[10];
    s = "23 11.1e-1 NAME";
    n = sscanf(s,"%d%f%s", &i, &x, name);   /*iに23,xに1.110000,nameに“NAME”を格納,*/
                                            /*戻り値nは3*/
}