フォーマットされた入力

入力で期待されるデータの形式を指定することができる。形式は、読み込むデータと無視する文字の両方を指定する。

Dの入力フォーマット指定子は、C言語のフォーマット指定子と似ている。

前の章で既に使用してきたように、フォーマット指定子 " %s"は、変数の型に応じてデータを読み込む。例えば、次の変数の型はdoubleなので、入力された文字は浮動小数点数として読み込まれる。

double number;

readf(" %s", &number);
D

フォーマット文字列には、3種類の情報を指定できる。

フォーマット文字列を使用すると、入力から特定の情報を選択し、他の情報を無視することができる。

フォーマット文字列で3種類の情報をすべて使用する例を見てみよう。入力に、学生番号と成績が次の形式で入力されると仮定しよう。

番号グレード
12390

さらに、number:grade:というタグは無視する必要があるとする。次のフォーマット文字列は、番号と成績の値を選択し、その他の文字は無視する。

int number;
int grade;
readf("number:%s grade:%s", &number, &grade);
D

でハイライト表示されている文字は、 "number:%s grade:%s"でハイライトされている文字は、入力で指定されたとおりに正確に表示されなければならない。readf()はそれらを読み取り、無視する。

上記のフォーマット文字列に表示されている単一のスペース文字は、その位置に正確に存在するすべての空白文字を読み取り、無視する。

%文字はフォーマット文字列で特別な意味を持つため、その文字自体を読み込んで無視する必要がある場合は、フォーマット文字列内で%%と2回記述する必要がある。

入力から単一の行のデータを読み込む方法は、文字列の章strip(readln())として推奨されている。その方法の代わりに、フォーマット文字列の末尾に\n文字を配置することで同様の目的を達成できる:

import std.stdio;

void main() {
    write("First name: ");
    string firstName;
    readf(" %s\n", &firstName);    // ← 末尾の\n

    write("Last name : ");
    string lastName;
    readf(" %s\n", &lastName);     // ← 末尾の\n

    write("Age       : ");
    int age;
    readf(" %s", &age);

    writefln("%s %s (%s)", firstName, lastName, age);
}
D
formatted_input.1

"firstName"と"lastName"を読み込む際に、フォーマット文字列の末尾に"\n"を付けると、改行文字が入力から読み込まれ、無視される。ただし、文字列の末尾にある潜在的な空白文字は、strip()で削除する必要があるかもしれない。

フォーマット指定子文字

データの読み取り方法は、次のフォーマット指定文字で指定する。

d:10進数の整数を読み込む。

o:8進数で整数を読み込む。

x:10進数で整数を読み込む。

f: 浮動小数点数を読み込む。

s: 変数の型に従って読み込む。これは最もよく使われる指定文字だ。

c: 単一の文字を読み込む。この指定子は空白文字も読み込むことができる。(無視する動作をキャンセルする。)

例えば、入力に"23 23 23"が含まれている場合、フォーマット指定子によって値の読み取り方が異なる。

int number_d;
int number_o;
int number_x;

readf(" %d %o %x", &number_d, &number_o, &number_x);

writeln("Read with %d: ", number_d);
writeln("Read with %o: ", number_o);
writeln("Read with %x: ", number_x);
D

入力には 3 組の"23"という文字が含まれているが、変数の値は異なる。

%dページ目を読む23
%oページ目を読む19
%xページ目を読む35

注釈:簡単に説明すると、"23"は8進数では 2x8+3=19、16進数では2x16+3=35と同じだ。

演習

入力が年.月.日の形式で日付を表していると仮定しよう。月の番号を出力するプログラムを書け。例えば、入力が2009.09.30の場合、出力は9となる。