Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
scanf() / fscanf() / sscanf()
書式文字列にしたがって入力を読み込み、変数に格納します。『scanf()』は標準入力(キーボード)から、『fscanf()』は指定したストリーム(ファイルなど)から読み込みます。どちらも『<stdio.h>』に含まれています。
構文
#include <stdio.h> // 標準入力から書式付きで読み込みます(変数にはアドレスを渡します)。 scanf(書式文字列, &変数1, &変数2, ...); // 指定したストリームから書式付きで読み込みます。 fscanf(ストリーム, 書式文字列, &変数1, &変数2, ...); // 文字列から書式付きで読み込みます(文字列パース)。 sscanf(文字列, 書式文字列, &変数1, &変数2, ...); // 戻り値は正常に読み込めた項目数です。 // EOF 入力や読み込み失敗時は 0 またはEOFを返します。 int ret = scanf(書式文字列, &変数);
scanf の書式指定子と注意点
| 指定子 | 対応する型 | 概要 |
|---|---|---|
| %d | int * | 10進数の整数を読み込みます。 |
| %f | float * | 浮動小数点数をfloat型で読み込みます。 |
| %lf | double * | 浮動小数点数をdouble型で読み込みます。printf と異なり『l』が必要です。 |
| %c | char * | 1文字を読み込みます。空白文字も読み込みます。 |
| %s | char * | 空白文字(スペース・改行など)区切りで文字列を読み込みます。バッファオーバーフローに注意が必要です。 |
| %[幅]s | char * | 最大幅文字まで読み込みます(例:『%63s』で63文字まで)。 |
サンプルコード
#include <stdio.h>
int main(void) {
// 整数を読み込みます(アドレスを渡すことに注意します)。
int age;
printf("年齢を入力してください: ");
if (scanf("%d", &age) == 1) {
printf("入力された年齢: %d\n", age);
}
// 実数を読み込みます(double は %lf を使います)。
double price;
printf("価格を入力してください: ");
scanf("%lf", &price);
printf("価格: %.2f円\n", price);
// 文字列を読み込みます(最大63文字+ヌル文字で64バイト必要です)。
char name[64];
printf("名前を入力してください: ");
scanf("%63s", name); // バッファサイズ - 1 を指定します。
printf("名前: %s\n", name);
// 複数の値を一度に読み込みます。
int x, y;
printf("座標を入力してください(例: 3 5): ");
if (scanf("%d %d", &x, &y) == 2) {
printf("座標: (%d, %d)\n", x, y);
}
// sscanf で文字列をパースします。
char record[] = "Taro 20 95.5";
char person_name[32];
int person_age;
double person_score;
sscanf(record, "%s %d %lf", person_name, &person_age, &person_score);
printf("名前: %s, 年齢: %d, 点数: %.1f\n", person_name, person_age, person_score);
// 『名前: Taro, 年齢: 20, 点数: 95.5』と出力されます。
// fscanf でファイルから読み込みます。
FILE *fp = fopen("data.txt", "r");
if (fp != NULL) {
int val;
while (fscanf(fp, "%d", &val) == 1) {
printf("読み込み: %d\n", val);
}
fclose(fp);
}
return 0;
}
概要
『scanf()』に変数を渡すときは必ずアドレス演算子『&』を付けてください。文字列(char配列)の場合は配列名がそのままアドレスになるため『&』は不要です。『%s』でバッファサイズを指定しないと、長い入力でバッファオーバーフローが発生します。必ず最大文字数を指定してください(例:『%63s』)。より安全な行入力には『fgets()』の使用を推奨します。
『scanf()』は入力に失敗した場合、バッファに不正な入力が残ることがあります。戻り値で読み込み成功数を確認し、エラー処理を行うことが重要です。改行文字が残る場合は『scanf(" %c", &c)』のように書式文字列の先頭に空白を入れると前の空白・改行をスキップできます。
書式付き出力については『printf() / fprintf()』を、安全な文字列入力については『fgets()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。