scanf, fscanf, sscanf - 書式つき入力変換

【書式】

#include <stdio.h>

int scanf(const char *format, ...);

int fscanf(FILE *fp, const char *format, ...);

int sscanf(const char *buf, const char *format, ...);

【解説】

scanf(), fscanf(), sscanf()は書式付き入力関数で、制御文字列formatに

従って入力を変換します。scanf()は標準入力から、fscanf()はfp で示され

るファイルから、 sscanf() は bufで示される文字列から入力を取り出しま

す。

制御文字列中の変換仕様に従い入力を変換し、対応するパラメタをポインタ

として取り出し、そこへ変換されたオブジェクトを格納します。したがって

パラメタはポインタでなければならない点に注意してください。

printf(3)と同じく、変換仕様とパラメタは型、 個数ともに一致しなくては

なりません。一致しないとおかしな結果が得られることがあります。

制御文字列 formatは%ではじまる変換仕様と通常の文字で構成されます。通

常の文字は入力された文字と一致しなければならず、一致していなければそ

の時点で入力処理を終了し、リターンします。ただし、制御文字列中の空白

文字は読みとばされ、入力文字とのマッチング対象にはなりません。

変換仕様は次の形式をとります。

%[*][width][type]conversion

*は代入禁止文字と呼ばれます。 省略された場合は対応するパラメタが示す

アドレスに変換されたオブジェクトを代入しますが、代入禁止が指定されて

いると入力の変換は実行されますがパラメタの取り出しも代入も実行されま

せん。

width は変換される入力の最大の文字数を指定します。省略された場合は可

能な限り変換されます。もしwidth 文字だけ入力しきらないうちに変換不可

能な文字を入力した場合は、その時点で変換は打ち切られます。widthに0を

指定した場合は、省略されたとみなします。

typeは対応するパラメタの型を示します。d, u, o, x, X, i変換において省

略された場合は intもしくはunsigned int型であり、hの場合はshort intも

しくはunsigned short int型、lの場合はlong int型もしくはunsigned long

int型となります。p変換ではtypeにfarポインタを示すF、nearポインタを示

すNを使用することができます。e, E, f, g, G変換では省略時はfloat型、l

の場合はdouble型、Lの場合はlong double型を示します。h, l, L, F, Nは

どのような順番に何回現れてもかまいませんが、最後に現れたものが有効に

なります。また、e, E, f, g, G変換に対するhのような無意味な指定は、指

定が省略されたとみなされます。

conversionは変換の形式を決定する文字で、省略できません。以下のものが

指定できます。

d, u, o, x, X, i

dは符号付き10進、uは符号なし10進、oは符号なし8進、x, Xは符号なし

16進の入力です。まず先行する空白文字をスキップし、入力変換を開始

します。widthは空白をスキップした後で有効になります。x, o変換で

は、それぞれ 0x(あるいは0X), 0が先頭に付いていても正しく変換され

ます。u, o, x, X変換の入力に-が付いていてはいけません。

i変換は入力をintに変換し、パラメタint * が指す変数に代入します。

入力文字列の先頭が0のときには8進数として変換し、0xまたは0Xのとき

には16進数として変換します。それ以外のときには10進数として変換し

ます

s

文字列を入力します。対応するパラメタはchar *として取り出され、そ

こには入力された文字列と文字列の終了を示すナル文字('\0')が格納さ

れます。パラメタは文字列を格納するのに十分な大きさを持っていなけ

ればなりません。その変換においてはまず先行する空白文字が読み捨て

られ、次の文字から格納を開始します。そして次に空白文字に出会った

時に入力を終了します。その空白文字は入力されません

c

1 文字を入力します。対応するパラメタはchar *として取り出され、入

力された 1文字が格納されます。空白文字の読みとばしはおこないませ

んので、次の空白文字以外の文字を読みたい場合には%1s を用いてくだ

さい。 フィールド幅(width)を指定した場合は、取り出されたchar *を

インクリメントしながらc変換をwidth回繰り返します。これはs 変換と

同様にフィールド幅だけの文字を入力しますが、最後を示すナル文字を

格納しない点が異なります。また、そのときのパラメタは文字配列への

ポインタでなければなりません。

[...]

s 変換と同様に文字列を入力しますが、最初の空白文字の読みとばしは

せず、また入力は[...]で示される文字が続く間だけ読まれます。 それ

以外の文字に出会った時に終了します。

[...]は次のような表記が許されます。

[ABC012]

ABC012のうちのどれかの文字

[A-Fa-f0-9]

16進数字

また、[の直後に^が現われると、その後ろで定義したもの以外という意

味になります。

[^A-Z]

大文字のAからZ以外の文字

先頭以外の位置に現われた^は文字としての^自体を表します。

[^,.^]

,.^以外の文字

[_^$]

_^$のうちどれかの文字

パラメタはchar *としてとられ、入力終了時にはナル文字が加えられま

n

n変換はこれまでに入力された文字数を対応するパラメタint *が指す変

数に代入します。この変換はscanf()が返す値には含まれません。

p

ポインタ値を入力し、パラメタが指しているアドレスに格納します

e, E, f, g, G

浮動小数点数を入力します。対応するパラメタは浮動小数点型へのポイ

ンタでなければなりません。 浮動小数点数のフォーマットは自由で、

printf(3)のe, E, f, g, G 変換で出力したものはいずれも入力可能で

す。

x, e, gは大文字で書くことも可能ですが、大文字、小文字の違いはありま

せん。 変換が正しくない入力文字により終了した場合は、 その文字は

ungetc(3)されて読んでいない状態に戻されます。また、 後続する空白文字

も読み込みません。

scanf() 一族はライブラリファイルdoslib.libとintlib.libの両方に含まれ

ています。intlib.libに含まれているscanf()には、 浮動小数点数の表示機

能(f, e, E, g, G)がありません。これは、浮動小数点数の表示を必要とし

ない多くのプログラムにムダな浮動小数点演算パッケージをリンクしないよ

うにして、作成した実行ファイルを小さくするために用意しました。こちら

の scanf()を使う場合には、次のようにintlib.libをライブラリとして指定

してください。

lcc prog.c -lintlib

【リターン値】

入力変換と代入に成功した変換の数を返します。エラーが生じた時には値-1

を返します。

【可搬性】

sscanf()

ANSI, UNIX, DOS窓

それ以外

ANSI, UNIX, DOS窓

【参照】

printf(3), fprintf(3), sprintf(3)

【copyright (c) 安江正樹@東海大学理学部物理学科】