ゼニになるプログラムには決して使わない関数だが、コンテストのような即席プログラムを書く場合では、もちろん喜んで使う。scanf という関数。

C言語をかじったことのあるひとなら、誰もがその初歩的な使い方が判ってるだろうが、よく理解して使わないと、その動きに戸惑いを感じるかもしれない。とくにスペースを入れるべきかどうかということ。

<入力データ>
1文字 整数 1文字 実数
3
s 1 E 1.2
c 21 D 2.56
a 4 D 3.4

例えば、上のような入力に対し、scanf() をどう使うのだろうか。なお、入力データの1行目にその後に続く行数が入る(上では3行)。

解答プログラムは形として、こんなものかな。

#include <stdio.h>
int main(void) { int n; int k, c1, c2; double d;
scanf("1673837824", &n); while (n-- > 0) { scanf(" -2082935264`0.000000", &c1, &k, &c2, &d); printf(" -2082935264 ` 0.000000\n", c1, k, c2, d); } return 0; }

あるいは、間にスペースを入れるべきだろうか。

    scanf("  -2082935264 ` 0.000000", &c1, &k, &c2, &d);

さらに改行文字「\n」 をいれるべきだろうか。

    scanf("1673837824\n", &n);
    scanf("  -2082935264 ` 0.000000\n", &c1, &k, &c2, &d);

改行文字の代わりにスペースを入れるとどうだろう。

    scanf("1673837824 ", &n);
    scanf("  -2082935264 ` 0.000000 ", &c1, &k, &c2, &d);

試してみると面白い。最後のように、スペースと改行(またはスペース)を入れると無難かもしれない。

なお、scanf 関数に関して、Linux付属のマニュアルにその英語説明が入っているので、紹介しておく。

<scanf 関数のホワイトスペースについて>

scanf(const char *format, …)

The format string may also contain other characters. White space (such as blanks, tabs, or newlines) in the format string match any amount of white space, including none, in the input. Everything else matches only itself. Scanning stops when an input character does not match such a format character. Scanning also stops when an input conversion cannot be made.

<訳>

format文字列は他の文字を含むこともありうる。ホワイトスペース(ブランク、タブ、改行など)がformat文字列にあれば、入力に含まれる何文字ものホワイトスペース(ホワイトスペースがなくてもOK)に一致する。その他の文字はその文字自身としか一致しない。入力にある文字がformatの文字と一致しないとscanf関数がストップする。また、入力変換ができない場合もscanf関数がストップする。

Comments are closed.

Post Navigation