scanf()は、書式付きデータを標準入力から読み込みます。
#include <stdio.h>
int scanf(const char *fmt, ...);
引数fmtには読み込むデータの書式を指定する文字列を指定します。...には読み込んだデータを保存するための変数のポインタを並べて記述します。
データは、空白、タブ、改行で区切られているものと解釈されます。
この関数は読み込みに成功したデータの数を返します。
書式は次のような文字列で指定します。
%[*] [width] [pre-type]type
各部分の詳細は以下のとおりです。
*は入力の値を引数に保存しない時に指定します。
widthには入力の文字幅(文字列にしたときの長さ)を指定します。
pre-typeには、次のtypeで指定する入力数値データ引数のデフォルトサイズを変更します。
typeには次の表に示すデータの型を指定します。
タイプ | 意味 |
---|---|
h | |
l、L | データはlongまたはワイド文字。I64のときは64ビット整数。 |
c、C | 1個の文字。 |
d | intを符号付き10進整数で入力 |
i | intを符号付き8進整数で入力 |
o | intを符号なし8進整数で入力 |
u | intを符号なし10進整数で入力 |
x、X | intを符号なし16進整数、"abcdef"を使用。Xのときは"ABCDEF"で入力。 |
e、E | floatを[-]d.dddd e [+/-]ddd形式符号付きの値で入力。 |
f | floatを[-]dddd.dddd形式の符号付きの値で入力。 |
g、G | floatをfまたはeの書式のうち指定された値および精度を表現できる短い方の書式で入力。 |
s、S | 文字列を最初のNULL文字('\0')までまたはprecisionの範囲まで入力。Sの場合はワイド文字列。 |
通常、printf()系のデフォルトの実数の型はdoubleですが、scanf()系の実数の型はfloatです。 実数はfloat変数で受け取ってからdoubleに変換する必要があります。
たとえば、「123 hello」というデータを読み込むときのコードは次のようになります。
int n;
char s[BUFSIZ];
scanf("%d %s", &n, s);
また、たとえば「123.45 A C」というデータを読み込むときのコードは次のようになります。
double v;
char x, y;
scanf("%6.2lf %c %c", &v, &x, &y);
次の例は、fgets()およびscanf()を使って文字列と整数および実数を入力し、printf()で書式を指定して出力する例です。
#include <stdio.h>
int main(int argc, char *argv[])
{
char buff[BUFSIZ];
int n;
float f;
double v;
printf("文字列>");
fgets(buff, BUFFSIZE, stdin);
printf("整数実数>");
scanf("%d %f", &n, &f);
printf("文字列%s\n", buff);
v = (double)f;
printf("%03d %x %5.2f %e\n", n, n, f, v);
return 0;
}
scanf(const char *fmt, ...);はfscanf(stdin, const char *fmt, ...);と同じです。