SCANF(3)            Linux Programmer's Manual            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 specifications) を含めることができ、変換指定が
       あ れば、その変換の結果は format に続く pointer 引き数が指
       す場所に格納される。それぞれの pointer 引き数の型は、対 応
       する変換指定が返す値に適合していなければならない。

       format 中の変換指定の個数が pointer 引き数の数より多かった
       場合の結果は未定義である。 pointer 引き数の数が変換指定 の
       個 数よりも多かった場合、余分な pointer 引き数の評価は行わ
       れるが、それ以外は行われず無視される。

       scanf() 関数は標準入力ストリーム stdin からの入力を読み 込
       む。 fscanf() はストリームポインタ stream からの入力を読み
       込む。 sscanf() は文字列ポインタ str で示された文字列か ら
       の入力を読み込む。

       vfscanf()  関数は vfprintf(3) と同様に、ストリームポインタ
       stream からの入力をポインタの可変長引き数リストを用いて 読
       み 込む (stdarg(3) を参照)。 vscanf() 関数は、可変長引き数
       のリストに基づき標準入力からの読み取りを行 う。  vsscanf()
       関数はそのリストに基づき文字列から読み取る。これらの関係は
       vprintf(3) と vsprintf(3) 関数の関係と同様である。

       format 文字列は 「命令」 (directive) の列で構成される。 命
       令は入力文字の系列をどのように処理するかを指示するものであ
       る。ある命令の処理が失敗すると、入力はそれ以上読み込 ま れ
       ず、  scanf()   は 返 る。「失敗」は 「入力の失敗」 (input
       failure) と 「一致の失敗」 (matching failure) のいずれかで
       ある。入力の失敗は入力文字が使用できなかったことを意味し、
       一致の失敗は入力が不適切であったこと (下記参照) を意 味 す
       る。

       命令は以下のいずれかである:

       o      ホ ワ イ トスペース (スペース、タブ、改行など; iss-
              pace(3) 参照) の列。この命令は、入力中の任意の個 数
              の ホワイトスペースに一致する。 (「何もなし」にも一
              致する)。

       o      通常文字 (つまり、ホワイトスペースと '%' 以外 の 文
              字)。この文字は入力の次の文字に正確に一致しなければ
              ならない。

       o      変換指定。変換指定は '%' (パーセント) 文字 で 始 ま
              る。 入力された文字の系列はこの指定にもとづいて変換
              され、変換結果は対応する pointer 引き数が指す場所に
              格 納される。入力の次の文字が変換指定と一致しない場
              合は、変換は失敗する -- これが   「一 致 の 失 敗」
              (matching failure) である。

       format  中の各々の 「変換指定」は文字 '%' か文字系列 "%n$"
       (違いについては後述) で始まり、以下の要素が続く。

       o      代入抑制文字 '*' (省略可能)。 scanf() は変換指定 に
              指 示された通り入力を読み込むが、その入力は捨てられ
              る。対応する pointer 引き数は必要なく、 scanf()  が
              返す代入が成功した数にこの指定は含まれない。

       o      文字 'a' (省略可能)。これは文字列変換とともに使用さ
              れ、これを使うと呼び出し元が入力を保持する対応す る
              バッ ファを確保する必要がなくなる。代わりに scanf()
              が必要な大きさのバッファを確保し、このバッファの ア
              ドレスを対応する pointer 引き数に代入する。 pointer
              引き数は char * 型の変数へのポインタでなければな ら
              な い (変数自体は呼び出し前に初期化されている必要は
              ない)。呼び出し元は、不要になった時点で、こ の バッ
              ファ を free(3) すべきである。この機能は GNU による
              拡張である。 C99 は 'a' 文字を変換指定として使用 し
              ている (こちらも GNU の実装と同じように使用すること
              ができる)。

       o      「最大フィールド幅」を指定する 10進数 (省略可 能)。
              こ の最大値に達するか、一致しない文字が見つかるか、
              のどちらかになると、文字の読み込みを停止する。ほ と
              ん どの変換では、先頭のホワイトスペース文字は捨てら
              れ (例外については後述する)、捨てられたこれらの文字
              は 最大フィールド幅の計算には含まれない。文字列の入
              力変換では、入力の末尾を示すヌル終端文字 ('\0')  も
              格 納されるが、最大フィールド幅にはこの終端文字は含
              まれない。

       o      「型修飾子」 (type modifier characters)  ( 省 略 可
              能)。 例えば、型修飾子 l を %d などの整数変換と一緒
              に使うと、対応する pointer 引き数が int で は な く
              long int を参照していることを指定できる。

       o      「変換指定」 : 実行すべき入力変換の種類を指定する。

       format 中の変換指定は、'%' で始まるか、 "%n$" で始ま る か
       の、いずれかの形式である。これら 2つの形式を同じ format 文
       字列に混ぜることはできない。但し、"%n$" を含む文字列に  %%
       と  %* を含めることはできる。 format に '%' 指定が含まれて
       いる場合、各々の '%' 指定と後続の pointer 引き数はその順番
       通りに対応する。 "%n$" 形式 (POSIX.1-2001 では規定されてい
       るが、C99 にはない) では、 n は 10進数であり、変換後の入力
       を format の後ろの n 番目の pointer 引き数が参照する場所に
       格納することを指定する。

   変換
       変換指定には、以下の 「型修飾子」を入れることができる。

       h      変換が diouxX または n のいずれかであり、次のポイン
              タが (int ではなく) short int か unsigned short int
              へのポインタであることを示す。

       hh     h と同じだが、次のポ イ ン タ が  signed  char   か
              unsigned char へのポインタであることを示す。

       j      h  と同じだが、次のポインタが intmax_t か uintmax_t
              へのポインタであることを示す。この修飾子は C99 で導
              入された。

       l       変 換が diouxX か n のいずれかであり次のポインタが
              (int ではなく) long int か unsigned long int へのポ
              インタであること、または、変換が efg のうちのひとつ
              であり次のポインタが (float ではなく) double へのポ
              インタであることのいずれかであることを示す。 l 文字
              を二つ指定すると、 L と同じ意味となる。 %c や %s と
              と もに使用すると、パラメータはそれぞれワイド文字や
              ワイド文字列へのポインタであるとみなされる。

       L      efg 変換で、次のポインタが long double へのポインタ
              であることを示す。もしくは、 dioux 変換で、次のポイ
              ンタが long long へのポインタであることのいずれかで
              あることを示す。

       q      L   と 同一である。この修飾子は ANSI C には存在しな
              い。

       t      h と同様だが、次のポインタが ptrdiff_t へのポインタ
              であることを示す。この修飾子は C99 で導入された。

       z      h  と同様だが、次のポインタが size_t へのポインタで
              あることを示す。この修飾子は C99 で導入された。

       以下の 「変換指定子」が利用可能である。

       %      文字 '%' に対応する。書式文字列の中の %% は単一の文
              字 '%' に対応する。変換は行われず、変数への代入は生
              じない。

       d      符号つきの 10進の整数に対応する。次のポインタは int
              へのポインタでなければならない。

       D      ld と同一である。これは以前の仕様との互換性だけのた
              めにある。 (注意: これは libc4 の場合だけで あ る。
              libc5 や glibc では %D は暗黙のうちに無視され、古い
              プログラムにおいて謎に満ちた失敗の原因となる。)

       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 と同一である。

       a      (C99) f と同一である。

       s       ホワイトスペースではない文字で構成された文字列に対
              応する。次のポインタは文字の配列へのポインタでな け
              れ ばならず、その文字配列は、入力された文字列と (自
              動的に追加される) ヌル終端文字 ('\0') を格納する の
              に 十分な大きさでなければならない。文字列の入力は、
              ホワイトスペースが入力されるか、最大フィールド幅 に
              達するか、のどちらかが起こると停止される。

       c       「最大フィールド幅」 (デフォルトは 1) で指定された
              幅の文字の列に対応する。次のポインタは char への ポ
              イ ンタで、すべての文字を格納するのに十分な領域がな
              ければならない (終端の NULL バイトは追加されない)。
              通 常行われる先頭のホワイトスペースの読み飛ばしは行
              われない。先頭のホワイトスペースを読み飛ばすため に
              は、 フォーマット文の中で明示的にスペースを使用すれ
              ば良い。

       [      格納された文字列のうちから取り出された、指定され た
              文 字 の 集合で構成される空ではない文字の列に対応す
              る。次のポインタは char へのポインタでなければな ら
              ず、 そこには文字列中のすべての文字と終端の NULL バ
              イトを格納するための十分な領域がなければならな い。
              通 常行われる先頭のホワイトスペースの読み飛ばしは行
              われない。この文字列は特別な集合の中の文字で構成 さ
              れ ている。この集合は開き括弧 [ と閉じ括弧 ] の間の
              文字で定義される。開き括弧のあとの最初の文字が曲 ア
              クセント記号 (^) の場合、集合はこれらの文字を含まな
              いものとなる。閉じ括弧を集合に含ませるためには、 こ
              の 文字を開き括弧または曲アクセント記号のあとの最初
              の文字にすればよい。つまり、他の位置に閉じ括弧を 置
              くと文字の集合が終る。ハイフン - もまた特殊文字であ
              る。二つの異なる文字の間に置かれた時、この文字 は、
              そ の間にある全ての文字を集合に加える。ハイフン自体
              を含ませるためには、括弧が閉じる前の最後の一文字 を
              ハ イフンにすればよい。例えば、 [^]0-9-] は「閉じ括
              弧、0 〜 9、ハイフンの 3 種類を除く全ての文字」の集
              合 を意味する。この文字列は集合に含まれていない (曲
              アクセントの場合には含まれる) 文字の出現または確 保
              された領域が使い切られた時に終了する。

       p      (printf(3) の %p で印字されるような) ポインタ値に対
              応する。次のポインタは void へのポインタへのポイ ン
              タでなければならない。

       n       どんな入力も必要としない。そのかわりに、入力からこ
              こまで消費された文字数が次のポインタで指定された 場
              所に格納される。このポインタは int へのポインタでな
              ければならない。変換を抑制するのであれば * 代入抑制
              文 字を使って抑制することができるのだが、この変換指
              定子は変換では「ない」。 C 言語の標準規格では「実行
              の 完了時に返される代入の回数は %n 命令の実行では増
              加しない」となっているが、正誤表の内容はこれと矛 盾
              す るようである。おそらく、 %n 変換が返り値に与える
              影響についてはどのような仮定もしないのが賢明であ ろ
              う。

返り値
       これらの関数は、一致と代入が成功した入力要素の個数を返す。
       返される値は渡された変換の個数よりも少ないこともあり、最初
       に一致の失敗があった場合には 0 になることもある。

       最初の変換が成功する前に入力の最後に達して、一致の失敗が起
       こった場合には、 EOF が返される。また、読み込みエラーが 発
       生 した場合にも EOF が返される。読み込みエラーの場合には、
       そのストリームのエラー指示子がセットさ れ  (ferror(3)   参
       照)、 errno にエラーを示す値がセットされる。

準拠
       fscanf(), scanf(), sscanf() 関数は C89 と C99 に準拠してい
       る。

       q 指定子は long long の 4.4BSD での記述方法である。一 方、
       整数変換での ll または L の使用は GNU での拡張である。

       これらの関数の Linux 版は GNU libio ライブラリーを元にして
       いる。より簡潔な説明には GNU libc (glibc-1.08) の info  文
       書に目を通すこと。

バグ
       全ての関数は、完全に C89 に準拠している。しかし追加で q と
       a 指定子が提供されており、同様に L と l 指定子の付加的な振
       る 舞いもある。後者は、 C89 で定義された指定子の振る舞いを
       変更するものなので、バグとみなされるかもしれない。

       ANSI C で定義された型修飾子と変換指定子の組み合わせの中 に
       は 意味をなさないものがある (例えば、 %Ld)。これらが指定さ
       れた場合、 Linux 上でははっきりと定義された振る舞いをす る
       かもしれないが、他のアーキテクチャでも同様になっているとは
       限らない。それゆえに、ほとんどの場合、 ANSI C で定義されて
       い な い修飾子を使用した方が良い。すなわち、 diouxX 変換や
       ll と組み合わせる場合には、 L の代わりに q を使用した方 が
       良い。

       q  の使用方法は 4.4BSD と同じではない。 4.4BSD では q は L
       と同等に浮動小数の変換に使用される。

関連項目
       getc(3),  printf(3)  setlocale(3),  strtod(3),  strtol(3),
       strtoul(3),



GNU                         1995-11-01                   SCANF(3)