SCANF(3S) — NEWS-OS Programmer’s Manual
名称
scanf, fscanf, sscanf − 書式化された入力の変換
形式
#include <stdio.h>
int scanf(format [ , pointer ] . . . )
char ∗format;
int fscanf(stream, format [ , pointer ] . . . )
FILE ∗stream;
char ∗format;
int sscanf(s, format [ , pointer ] . . . )
char ∗s, ∗format;
解説
scanf は、 標準入力ストリーム stdin からの読み出しを 行います。 fscanf は、 指定した入力ストリーム stream からの読み出しを 行います。 sscanf は、 文字列 s からの読み出しを 行います。 どの関数も、 文字を 読み出し、 書式にしたがって解釈し、 その引数に結果を 格納します。 各関数には、 引数として下記に記述される制御文字列 format と、 入力の変換結果が格納されるべき場所を 示す引数 pointer のセットが必要です。
通常、 制御変換は変換仕様を 含み、 これを 使用して入力シーケンスの解釈を 行います。 制御文字列には、 次のものがあります。
1. ブランク、 タブおよび改行。 これらの文字は、 入力中の任意の空白に対応します。
2. 普通の文字(%以外)。 入力ストリームの次の文字と一致しなければなりません。
3. 変換仕様。 文字 %、 代入抑止文字 ∗ (オプション)、 数値最大フィールド幅(オプション)、 および変換文字で構成される。
変換仕様は、 次に続く入力フィールドの変換を 指示します。 ∗ によって代入抑止が指定されていない限り、 結果は対応する引数で示された変数に格納されます。 入力フィールドは、 空白以外の文字列として定義されます。 このフィールドは、 次に適合しない文字まで、 また、 指定があれば、 そのフィールド幅を 使い尽くすまで続きます。
変換文字は、 入力フィールドの解釈方法を 示します。 対応する引数ポインタは、 通常決められた型のものでなければなりません。 次の変換文字が使用できます。
% 単一の ‘%’ が、 この位置での入力に必要とされます。 代入は行われません。
d 10進数の整数として解釈されます。 対応する引数は、 int へのポインタでなければなりません。
i 符号付き(なくてもよい)整数として解釈されます。 対応する引数は、 int へのポインタでなければなりません。 入力の文字列そのものが、次のように基数を決定します。 先頭がゼロの時は 8進数、 “0x” または “0X” の時は、16進数、 それ以外の場合は、10進数として変換されます。
o 8進数の整数として解釈されます。 対応する引数は、 int へのポインタでなければなりません。
x 16進数の整数として解釈されます。 対応する引数は、 int へのポインタでなければなりません。
s 文字列として解釈されます。 対応する引数は文字配列を 指す文字型ポインタで、 文字配列はその文字列とその終了を 示す ‘\0’ を 受け入れるだけの充分な大きさが必要です。 入力フィールドは、 空白文字あるいは改行文字で終了します。
c 文字として解釈されます。 対応する引数は、 文字へのポインタでなければなりません。 通常行われる空白文字のスキップは、 抑止されます。 次の空白以外の文字を 読み出すために、 ‘%1s’ を使います。 フィールド幅が指定された場合、 対応する引数は文字配列を 参照するものでなければなりません。 指定された数の文字が、 読み出されます。
p printf の %p 変換で出力されたものと解釈されます。 対応する引数は、 void ポインタへのポインタでなければなりません。
n 入力は使用されません。 対応する引数は、 int へのポインタでなければなりません。 この scanf が読み込んだ入力も字数がその整数に返されます。
e, f, g
浮動小数点数として解釈されます。 次のフィールドが変換され、 対応する引数に格納されます。 引数は、 float へのポインタでなければなりません。 浮動小数点の入力書式は、 省略可能な符号を 付けられた数字列で、 小数点が含まれていてもかまいません。 このあとには、 省略可能な指数フィールドが続きます。 指数フィールドは、 E または e と、 これに続く省略可能な符号付き整数とで構成されます。
[ 空白文字で区切られない文字列を示します。 左大かっこ ‘[’ の後ろには、 文字と右大かっこ ‘]’が続きます。 大かっこ [ ] の間の文字は、 文字列を構成する文字の集まりとして定義します。 文字列の先頭文字がサーカムフレックス(^)でない場合、 入力フィールドは大かっこ間で指定した文字以外の文字が現れるまでの、 すべての文字になります。 左大かっこ ‘[’ 直後の先頭文字が ‘^’ の場合、 入力フィールドは、 大かっこ間で指定した文字の残りの文字が現れるまでのすべての文字になります。 対応する引数は、 文字配列へのポインタでなければなりません。
変換文字 d、o、x の前に l を 付けることによって、 int ではなく long を 指すポインタが引数リストにあることを 示すことができます。 同様に、 変換文字 e または f の前に l を 付けて、 float ではなく double を 指すポインタを 示すことができます。 さらに、 変換文字 d、o、x の前に h を 付けて、 int ではなく short を 指すポインタが引数リストにあることを 示すことができます。
scanf 関数は、 一致して代入された入力項目の数を 返します。 この数を 使って、 入力項目がいくつ検出されたかを 知ることができます。 また、 入力終了時には、 定数 EOF を 返します。 この値は、 変換が 1つも行われなかったことを 示す 0 とは異なります。 ある変換を行おうとした場合、 入力がその変換には不適切な文字であると、 期待外れの結果になります。
例として、 次の呼び出し、
int i; float x; char name[50];
scanf("%d%f%s", &i, &x, name);
に次のような入力ラインがあると、
25 54.32E−1 thompson
i には値 25 が、 x には値 5.432 が代入され、 name は ‘thompson\0’ を 含みます。 また、 次の呼び出し、
int i; float x; char name[50];
scanf("%2d%f%∗d%[1234567890]", &i, &x, name);
に、 次のような入力があると、
56789 0123 56a72
i には値 56 が、 x には 789.0 が代入され、 ‘0123’ を スキップし、 文字列 ‘56\0’ が name に入れられます。 次に getchar を 呼び出すと ‘a’ が返されます。
関連事項
診断
scanf は入力終了後に EOF を 返し、 データ項目がなかったり、 無効であったりした場合は、 入力項目の数が減じられます。
バグ
文字の一致と 代入の抑制がうまくいっていることを、 直接知ることはできません。
NEWS-OSRelease 4.1C