SCANF(3) SCANF(3) 名前 scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf - 書式付き 入力変換 書式 #include int scanf( const char *format, ...); int fscanf( FILE *stream, const char *format, ...); int sscanf( const char *str, const char *format, ...); #include int vscanf( const char *format, va_list ap); int vsscanf( const char *str, const char *format, va_list ap); int vfscanf( FILE *stream, const char *format, va_list ap); 説明 scanf 関数グループは、以下に述べるように、format に従って 入力を読み込むものである。この書式は変換文字 (conversion specifiers) を含む。この変換の結果は(もしあれば) pointer 引数を通じて保存される。scanf 関数は標準入力ストリームstdin からの入力を読み込む。fscanf はストリームポインタstream か らの入力を読み込む。そしてsscanf は文字列ポインタstr で示 された文字列からの入力を読み込む。 vfscanf 関数はvfprintf(3) と同様に、ストリームポインタstream からの入力をポインタの可変長引数リストを用いて読み込む。( stdarg(3) を見よ。) vscanf 関数は、標準入力からの可変長引 数のリストを読み取る。そして、vsscanf 関数はそのリストを文 字列から読み取る。これらはvprintf とvsprintf 関数と同様で ある。 フォーマット文の後に続くpointer 引数は、ひとつひとつが変換 文字と正しく対応しなければならない(例外については以下の ` 抑止' をみよ)。すべての変換は% 文字(パーセント記号)によっ て示される。format 文字列は、その他の文字も含んで良い。 format 文字列の中の(空白、タブ、改行といった)ホワイトスペ ースは、入力の中の(「何もなし」を含む)ゼロ個以上のホワイト スペースに対応している。他のすべての文字は、それ自身のみに 対応する。読み込みは入力文字がフォーマット文字と合わなくな ると中止する。また、入力変換が成功しなかったときにも中止す る(以下の記述を参照すること). 1 November 1995 1 SCANF(3) SCANF(3) 変換 変換を示す% 文字に続いて、以下に示すような、フラグ 文字が ある場合もある。 * 引数への代入を抑止する。この文字につづく変換は普通に 行われるが、ポインタは使用されない。つまり、変換の結 果は単に捨てられるだけである。 a 変換がs であり、文字列のために必要とされるメモリ空間 がmalloc関数で確保され、そのメモリ空間へのポインタは char ポインタ変数へ代入されることを示している。このポ インタ変数は以前に初期化されている必要はない。このフ ラグはANSI C には存在しない。 h 変換がdioux またはn のいずれかであり、次のポインタが( int ではなく) short int へのポインタであることを示し ている。 l 変換がdioux n のいずれかであり次のポインタが( int で はなく) long int へのポインタであること、または、変換 がefg のうちのひとつであり次のポインタが( float では なく) double へのポインタであることのいずれかであるこ とを示している。ふたつのl フラグを指定することはL フ ラグと等価である。 L は、efg 変換であり次のポインタがlong double へのポイ ンタであること、または、dioux 変換であり次のポインタ がlong long へのポインタであることのいずれかであるこ とを示している。(long long がANSI C の型ではないこと に注意しよう。これを用いたプログラムは全てのアーキテ クチャに対して移植可能ではない。) q Lと同一である。このフラグはANSI C には存在しない。 これらのフラグに加えて、% と変換文字の間にオプションでつけ ることができる、10進の整数で表わされた最大フィールド幅をお くこともできる。もし幅が与えられないのなら、(以下で述べる 例外を除いて) デフォルト値である`無限大'が使用される。それ 以外の場合、この数字を上限として、多くの文字が変換の過程で 読み込まれる。変換が始まる前に、ほとんどの変換がスペースや タブを読みとばす。このときのホワイトスペースはフィールド長 に数えられない。 1 November 1995 2 SCANF(3) SCANF(3) 以下の変換が可能である。 % 文字`%'に対応する。書式文字列の中の `%%' は単一の文字 `%'に対応する。変換は行われず、変数への代入は生じない 。 d 符号つきの10進の整数に対応する。次のポインタはint へ のポインタでなければならない。 D ld と同一である。これは以前の仕様との互換性だけのため にある。 i 符号つき整数に対応する。次のポインタはint へのポイン タでなければならない。この整数は `0x' または `0X' で 開始する場合には16進数、 `0' で開始する場合には8進数 、その他の場合には10進数として読み込まれる。この変換 で使用される文字は、これらの基数に対応しているものだ けである。 o 符号なしの8進の整数に対応する。次のポインタはunsigned int でなくてはならない。 u 符号なしの10進の整数に対応する。次のポインタはunsigned int へのポインタでなければならない。 x 符号なしの16進の整数に対応する。次のポインタはunsigned int へのポインタでなければならない。 X x と同一である。 f 符号つき浮動小数点実数に対応する。次のポインタはfloat へのポインタでなければならない。 e f と同一である。 g f と同一である。 E f と同一である。 s ホワイトスペースではない文字で構成された文字列に対応 する。次のポインタはchar へのポインタでなければならず 、すべての文字および文字列の終りをしめすNUL 文字を格 納するために、配列は十分に大きくなければならない。文 字列の入力は、ホワイトスペースまたは最大フィールド幅( ふたつのうち最初に生じたもの)によって中止される。 1 November 1995 3 SCANF(3) SCANF(3) c width 個の文字の集まり(デフォルトは1)に対応する。次の ポインタはchar へのポインタでなければならず、すべての 文字を格納するために十分な領域がなければならない(終端 文字NUL は添付されない)。通常のホワイトスペースの読み 飛ばしは抑制される。はじめにホワイトスペースを読み飛 ばすためには、フォーマット文の中にあらわにスペースを 使用すれば良い。 [ 格納された文字列のうちから取り出された、指定された文 字の集合で構成される空ではない文字の列に対応する。次 のポインタはchar へのポインタでなければならず、そこに は文字列中のすべての文字と終端文字NUL を格納するため の十分な領域がなければならない。通常のホワイトスペー スの読み飛ばしは抑制される。この文字列は特別な集合の 中の文字で構成されている。この集合は開き括弧[ と閉じ 括弧] の間の文字で定義される。開き括弧のあとの最初の 文字が曲アクセント記号^ の場合、集合はこれらの文字を 含まないものとなる。閉じ括弧を集合に含ませるためには 、この文字を開き括弧または曲アクセント記号のあとの最 初の文字にすればよい。つまり、他の位置に閉じ括弧を置 くと文字の集合が終る。ハイフン- もまた特殊文字である 。二つの異なる文字の間に置かれた時、この文字は、その 間にある全ての文字を集合に加える。ハイフン自体を含ま せるためには、括弧が閉じる前の最後の一文字をハイフン にすればよい。例えば `[^]0-9-]' は`閉じ括弧、ゼロから 9そしてハイフンの3種類を除く全ての文字' という組合 せを意味する。この文字列は集合に含まれていない(曲アク セントの場合には含まれる)文字の出現または確保された領 域が使われ尽くされた時に終了する。 p ( printf(3) で `%p' で記されるような)ポインタ値に対応 する。次のポインタはvoid へのポインタでなければならな い。 n 引数を必要としない。そのかわりに、入力からここまで消 費された文字数が次のポインタを通じて格納される。この ポインタはint へのポインタでなければならない。* フラ グをもちいて抑制することができるにもかかわらず、これ は変換ではない。 C 言語の標準規格は `実行の完了時に返 される代入の回数を%n 命令の実行は増加させない' と言っ ているが、正誤表ではこれを否定するようである。おそら く、返り値の %n 変換の効果についてはどのような仮定も しないことが賢明であろう。 1 November 1995 4 SCANF(3) SCANF(3) 返り値 これらの関数は代入された入力要素の個数を返す。代入が失敗し た場合、この個数は用意されたよりも少なくもゼロにもなり得る 。ゼロは入力が可能である間に、どんな変換値も代入されなかっ たことを示している。典型的な例としては、 `%d' 変換時にアル ファベット文字が入力されたというような入力文字が不適切であ ったことが挙げられる。最初の変換の前にファイルの終端文字( end-of-file )があって、入力の失敗が生じた場合にはEOF が返 される。エラーやファイルの終端文字の出現が変換が始まった後 で生じた場合には、成功した変換の個数が返される。 関連項目 strtol(3), strtoul(3), strtod(3), getc(3), printf 準拠 fscanf, scanf, そしてsscanf 関数は ANSI C3.159-1989 (``ANSI C'') に準拠している。 q はlong long のBSD 4.4 での記述方法である。一方、整数変換 でのll またはL の使用は GNU での拡張である。 これらの関数の Linux 版はGNU libio ライブラリーを元にして いる。より簡潔な説明にはGNU libc (glibc-1.08) のinfo 文書 に目を通すこと。 バグ 全ての関数は、完全に ANSI C3.159-1989 に準拠している。しか し追加のq とa フラグが提供されており、同様にL とl フラグの 付加的な振る舞いもある。後者は、ANSI C3.159-1989 で定義さ れたフラグの振る舞いを変更するものなので、バグとみなされる かもしれない。 ANSI C で定義されたフラグの幾つかのフラグの組合せは、ANSI C では意味をなさないものがある(例えば、%Ld)。 Linux 上では定 義された振る舞いを持つであろうが、この振る舞いは他のアーキ テクチャーで同様になっている必要はない。それゆえに、ほとん どの場合、ANSI C で定義されていないフラグを使用した方が良 い。すなわち、diouxX 変換やll では、L の代わりにq を使用し た方が良い。 q の使用方法はL と同一である実数の変換に使用されるBSD 4.4 の場合と同じではない。 1 November 1995 5