フォーマットされた入力
入力で期待されるデータの形式を指定することができる。形式は、読み込むデータと無視する文字の両方を指定する。
Dの入力フォーマット指定子は、C言語のフォーマット指定子と似ている。
前の章で既に使用してきたように、フォーマット指定子 " %s"
は、変数の型に応じてデータを読み込む。例えば、次の変数の型はdouble
なので、入力された文字は浮動小数点数として読み込まれる。
フォーマット文字列には、3種類の情報を指定できる。
- スペース文字:入力のゼロ個以上の空白文字を示し、それらのすべての文字を読み込んで無視するように指定する。
- フォーマット指定子:出力フォーマット指定子と同様に、入力フォーマット指定子は
%
で始まり、読み込むデータのフォーマットを決定する。 - その他の文字: 入力でそのまま読み込まれる文字を示し、読み込まれて無視される。
フォーマット文字列を使用すると、入力から特定の情報を選択し、他の情報を無視することができる。
フォーマット文字列で3種類の情報をすべて使用する例を見てみよう。入力に、学生番号と成績が次の形式で入力されると仮定しよう。
番号 | グレード |
---|---|
123 | 90 |
さらに、number:
、grade:
というタグは無視する必要があるとする。次のフォーマット文字列は、番号と成績の値を選択し、その他の文字は無視する。
でハイライト表示されている文字は、 "number:%s grade:%s"
でハイライトされている文字は、入力で指定されたとおりに正確に表示されなければならない。readf()
はそれらを読み取り、無視する。
上記のフォーマット文字列に表示されている単一のスペース文字は、その位置に正確に存在するすべての空白文字を読み取り、無視する。
%
文字はフォーマット文字列で特別な意味を持つため、その文字自体を読み込んで無視する必要がある場合は、フォーマット文字列内で%%
と2回記述する必要がある。
入力から単一の行のデータを読み込む方法は、文字列の章でstrip(readln())
として推奨されている。その方法の代わりに、フォーマット文字列の末尾に\n
文字を配置することで同様の目的を達成できる:
"firstName
"と"lastName
"を読み込む際に、フォーマット文字列の末尾に"\n
"を付けると、改行文字が入力から読み込まれ、無視される。ただし、文字列の末尾にある潜在的な空白文字は、strip()
で削除する必要があるかもしれない。
フォーマット指定子文字
データの読み取り方法は、次のフォーマット指定文字で指定する。
s
: 変数の型に従って読み込む。これは最もよく使われる指定文字だ。
c
: 単一の文字を読み込む。この指定子は空白文字も読み込むことができる。(無視する動作をキャンセルする。)
例えば、入力に"23 23 23"が含まれている場合、フォーマット指定子によって値の読み取り方が異なる。
入力には 3 組の"23"という文字が含まれているが、変数の値は異なる。
%dページ目を読む | 23 |
---|---|
%oページ目を読む | 19 |
%xページ目を読む | 35 |
注釈:簡単に説明すると、"23"は8進数では 2x8+3=19、16進数では2x16+3=35と同じだ。
演習
入力が年.月.日の形式で日付を表していると仮定しよう。月の番号を出力するプログラムを書け。例えば、入力が2009.09.30
の場合、出力は9
となる。