Next: C++ Formatted Input, Previous: Formatted Input Strings, Up: Formatted Input [Index]
ここで述べる関数は,対応するCライブラリの関数と同じような機能を持ちます。標準のscanf
関数に対しては,変数を引数リストに並べます。vscanf
関数の場合は引数のポインタを与えます。詳細はVariadic Functions in The GNU C Library Reference Manual, もしくは ‘man 3 va_start’を参照して下さい。
書式指定文字列が間違っていたり,引数が正しく対応していなかったりした場合の動作は予測不能です。GCCの書式文字列チェック機能は,GMPの拡張書式指定に対応していないので使用できません。
fmt書式指定文字列と,結果を格納するメモリ領域は重複しないようにして下さい。
標準入力stdin
から読み取りを行います。
入力ストリームfpから読み取りを行います。
NULL終端子付き文字列sから読み取りを行います。
これらの関数の返り値は全て標準C99のscanf
関数と同一で,正常に処理して格納できたフィールド数になります。‘%n’フィールドと‘*’で無視されたフィールドは返り値には反映されません。
書式指定のフィールドを処理する前に入力の終了(もしくはファイルエラー)になったり,有効なフィールドがなかったりした時には,0ではなくEOF
が返り値になります。書式指定文字列内のホワイトスペース文字はオプション的な扱いになりますので,入っていたからといってEOF
を返すわけではありません。先頭部分のホワイトスペースは無視し,書式指定フィールドとしてはカウントしません。
GMPのデータ型に対しては,C99の読み取り規則に則って処理され,一文字先読みされつつ,書式指定通りに読み取りされます。入力数が書式指定と一致していない時には関数が停止され,値が格納されていないフィールドが取り残され,読み取りできた分のみカウントされて返り値に反映されます。例えば,mpf_t
型に対しては,入力が‘1.23e-XYZ’だとすると,‘X’まで読み取りされ,それ以降の文字は数字とは異なるので読み取りされません。‘1.23e-’という文字列は,‘e’の後に一桁以上の数字が求められますので,不正な値と判断されます。
標準Cのデータ型に対しては,現在のGMPの実装ではCライブラリのscanf
関数が呼び出されますので,有効な入力は少し緩いものになります。
gmp_sscanf
関数はgmp_fscanf
関数と同一で,読み取りの際に一文字先読みするかどうかの違いだけです。入力データ全体を見ますが,基本的にはgmp_fscanf
関数と同一の読み取りを行います。これはC99のsscanf
関数がfscanf
関数で実装されているのと同じです。