Next: , Previous: , Up: Formatted Input   [Index]


11.1 書式指定入力文字列

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ライブラリに依存します。

hshort
hhchar
jintmax_t または uintmax_t
llong int, double or wchar_t
lllong long
Llong double
qquad_t または u_quad_t
tptrdiff_t
zsize_t

GMPデータ型に対する書式指定入力子は次の通りです。

Fmpf_t, 浮動小数点数に変換
Qmpq_t, 有理数に変換(訳注:オリジナルはinterger?)
Zmpz_t, 整数に変換

使用できる書式変換指定子は下記の通りです。‘p’と‘l’はCライブラリに依存しますが,それ以外は標準Cと同じです。

c文字,もしくは文字列
d10進整数
e E f g G浮動小数点数
i基数指定付きの整数
n文字列
o8進整数
pポインタ
s区切り文字なしの文字列
u10進整数
x X16進整数
[ひとまとまりの文字列

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コードでなければダメで,今のところマルチバイト文字列は解釈できません。そのうち改善される予定です。