scanf() の一般的な形式は次のとおり。
scanf(制御文字列, ...);
制御文字列は printf() とよく似たフォーマット指定子とその他の文字からなる。「…」の部分は可変長の引数で、制御文字列内のフォーマット指定子と対応する。これらの引数はフォーマット指定子の指定する型のアドレスでなければならない。scanf() 自体は入力されたフィールドの数を返す。
フォーマット指定子
%c | 文字 |
%d | 10進数 |
%i | 10進数 |
%e | 浮動小数点数 |
%f | 浮動小数点数 |
%g | 浮動小数点数 |
%o | 8進数 |
%s | 文字列 |
%x | 16進数 |
%p | ポインタ |
%n | これまで読み込まれた文字数に等しい整数値を受け取る |
%u | 符号なし整数 |
%[] | 文字集合 |
%c と %n 以外については最大フィールド幅を指定できる。
注意しなくちゃいけないのは %s は文字列を読み込むけど、空白文字が現れるとそこで読み込みをやめてしまうこと。例えば、
This is a test.
という文字列を %s で読み込もうとしても、「This」しか読み込まれない。
#include int main(void) { char str[80]; printf("Input string: "); scanf("%s", str); printf("%s\n", str); return 0; }
takatoh@nightschool $ ./sample_8_6 Input string: This is a test. This
こういう場合は代わりに gets() を使う。
文字集合(スキャン集合)
%[ ] は大カッコで囲まれた文字を入力する。これをスキャン集合と呼ぶ。例えば
%[ABC]
という指定は A、B、C の続く限り読み込まれる。ほかの文字が現れた時点で次のフォーマット指定子に移る。[ ] 内の最初に ^ をつけることで否定を意味する。
#include int main(void) { char str[80]; printf("Input string: "); scanf("%[a-z]", str); printf("%s\n", str); return 0; }
takatoh@nightschool $ gcc sample_8_6b.c -o sample_8_6 takatoh@nightschool $ ./sample_8_6 Input string: ABCdefGHI �l,
ありゃ、文字化けする。なんかおかしいんだろうか。
フォーマット指定子内の*
フォーマット指定子に * をつけると、そのフィールドは読み込まれずに捨てられる。入力に不要な文字が含まれている場合に便利。
int first, second; scanf("%d%*c%d", &first, &second);
に対して
123-456
という入力があったとすると、first には 123、second には 456 が入力される。捨てられるフィールドに対応する引数は不要。
#include int main(void) { int first, second; printf("Input: "); scanf("%d%*c%d", &first, &second); printf("%d %d\n", first, second); return 0; }
takatoh@nightschool $ ./sample_8_6c Input: 123-456 123 456
制御文字列内のその他の文字の働き
制御文字列内に空白文字がある場合、scanf() は空白文字でない文字が現れるまで空白文字を捨てていく。その他の文字がある場合、一致しない文字が現れるまでその文字すべてを捨てていく。
include int main(void) { int first, second; printf("Input: "); scanf("A%d% %d", &first, &second); printf("%d %d\n", first, second); return 0; }
takatoh@nightschool $ gcc sample_8_6d.c -o sample_8_6d sample_8_6d.c: In function ‘main’: sample_8_6d.c:9:5: warning: unknown conversion type character 0x20 in format [-Wformat=] scanf("A%d% %d", &first, &second); ^ takatoh@nightschool $ ./sample_8_6d Input: AAA123 456 0 0
あれ、これもうまくいかない。