Next: Formatted Input Functions, Previous: Formatted Input, Up: Formatted Input [Index]
gmp_scanf
関数等の入力関数群は,標準入力関数scanf
と同様の書式指定入力文字列(see Formatted Input in The GNU C Library Reference Manual)の使用が可能です。書式指定は下記のように行います。
% [flags] [width] [type] conv
GMPはmpz_t
型用に‘Z’,mpq_t
型用に‘Q’,mpf_t
型用に‘F’をそれぞれ追加の書式指定子としました。このうち‘Z’と‘Q’は整数型のように使用できます。現在の仕様では‘Q’の場合は‘/’と分母を読み込み時に認識します。‘F’は浮動小数点型のように使用できます。
GMP型の変数は全てポインタになっていますので,gmp_scanf
関数に引数として渡す際に&
を付加する必要はありません。使い方としては次のようになります。
/* "a(5) = 1234"という形式で入力 */ int n; mpz_t z; gmp_scanf ("a(%d) = %Zd\n", &n, z); mpq_t q1, q2; gmp_sscanf ("0377 + 0x10/0x11", "%Qi + %Qi", q1, q2); /* "topleft (1.55,-2.66)"という形式で入力 */ mpf_t x, y; char buf[32]; gmp_scanf ("%31s (%Ff,%Ff)", buf, x, y);
標準Cのscanf
関数で使えるデータ型は全て利用可能で,GMPデータ型用の拡張指定と混ぜて使っても問題ありません。現在の実装では,標準データ型に対する書式指定はそのままscanf
に渡しているだけで,GMPデータ型用の拡張書式指定子のみ別個に処理を行っています。
使用できる書式指定フラグは下記の通りです。‘a’と‘'’については使用するCライブラリの実装に依存します。‘'’はGMPデータ型に対しては利用できません。
*
読み込みは行うが格納はしない a
バッファを確保する(文字列の変換用) '
桁まとめ機能。 GLIBCのスタイル(GMPデータ型には利用不可)
使用できる標準データ型は下記の通りです。‘h’と‘l’はどの環境でも使えますが,それ以外のものはコンパイラ(もしくはインクルードファイル),Cライブラリに依存します。
h
short
hh
char
j
intmax_t
またはuintmax_t
l
long int
,double
orwchar_t
ll
long long
L
long double
q
quad_t
またはu_quad_t
t
ptrdiff_t
z
size_t
GMPデータ型に対する書式指定入力子は次の通りです。
F
mpf_t
, 浮動小数点数に変換Q
mpq_t
, 有理数に変換(訳注:オリジナルはinterger?)Z
mpz_t
, 整数に変換
使用できる書式変換指定子は下記の通りです。‘p’と‘l’はCライブラリに依存しますが,それ以外は標準Cと同じです。
c
文字,もしくは文字列 d
10進整数 e
E
f
g
G
浮動小数点数 i
基数指定付きの整数 n
文字列 o
8進整数 p
ポインタ s
区切り文字なしの文字列 u
10進整数 x
X
16進整数 [
ひとまとまりの文字列
‘e’,‘E’,‘f’,‘g’,‘G’は同一の書式指定ができ,固定小数点方式や浮動小数点方式が使用可能です。‘E’と‘e’は浮動小数点方式の指数部を表わします。
C99スタイルの16進浮動小数点フォーマット(printf %a
,see Formatted Output Strings)はmpf_t
型のためだけに使用されます。通常の標準浮動小数点型に適用できるかはCライブラリ次第です。
‘x’と‘X’は同一の書式指定ができ,どちらも大文字小文字を区別せず16進数フォーマットを受け付けます。
‘o’, ‘u’, ‘x’,‘X’は全て,正数も負数も受け付けます。標準Cデータ型に対しては符号なし(unsigned)型として解釈しますので,オーバーフローの扱いに関しては違いが出ます。負数はstrtoul
関数に渡されて処理が行われます( see Parsing of Integers in The GNU C Library Reference Manual)。GMPのデータ型に対してはオーバーフローは起こりませんので,‘d’も‘u’も同じ意味になります。
‘Q’は分子を読み込み,必要があれば分母を読み取ります。標準形ではない形式であれば,実際にその値を使う前にmpq_canonicalize
関数で変換しておく必要があります(see Rational Number Functions)。
‘Qi’は,分子と分母の基数を別個に読み取ることができます。例えば,‘0x10/11’は16/11となり,‘0x10/0x11’は16/17となります。
‘n’は,GMPデータ型も含む上記の全ての書式指定に適用することができます。‘*’は無視したい文字列を指定する時に使います。
標準Cライブラリのscanf
関数で使用される他の書式指定子は,gmp_scanf
関数では利用できません。
フィールドの前のホワイトスペース(空白文字)は読み込み時に無視されます。‘c’と‘[’の指定がある時にはそのまま読み込まれます。
浮動小数点数に対する書式指定子の場合,小数点を表わす文字は実行時のロケール次第です(localeconv
関数で指定可能 (see Locales and Internationalization in The GNU C Library Reference Manual)。標準浮動小数点入力に対しては通常のCライブラリ関数でも同様です。
書式指定文字列はASCIIコードでなければダメで,今のところマルチバイト文字列は解釈できません。そのうち改善される予定です。