scanf()関数
scanf()関数は、指定された書式文字列に従って標準入力(standard input)から書式文字列に従ってデータを読込みます。
scanf()関数が実行されると、キー入力待ち状態となります。
必須ヘッダ
#include <stdio.h>
宣言
int scanf(char const* const _Format, ...)
scanf()関数の利用
scanf()関数は、指定された書式文字列に従って標準入力から入力されたデータを読込み、書式文字列 に続く引数の指すオブジェクトに代入します。
scanf()の動作は与えられた引数の前に stdin を引数として付加した fscanf()関数 と同じです。
構文
scanf(書式文字列, &変数);
戻り値
成功した場合: 代入された入力項目の個数
失敗した場合: EOF
scanf()関数を使用した記述例
// scanf() program in C.
#include <stdio.h>
int main(int argc, char *args[])
{
char str[256]; // 読込バッファ
memset(str, 0x00, sizeof(str));
printf("非空白類文字列を入力してください\n");
// 非空白類文字列の読み込み
scanf("%s", str);
printf("入力された値 = %s\n", str);
return 0;
}
実行結果
scanf()関数にて入力待ち状態となります。
非空白類文字列を入力してください
_
キーボードから文字列を入力します。例:abcdef
非空白類文字列を入力してください
abcdef_
Enterを入力後、scanf()関数以降の処理が実行され、入力結果が表示されます。
非空白類文字列を入力してください
abcdef
入力された値 = abcdef
書式文字列について
書式文字列
%[代入抑止文字][フィールド幅][長さ修飾子]変換指定子
代入抑止文字
代入抑止文字 に * (アスタリスク) を指定すると指定された型は引数に代入されず読み飛ばされます。
長さ修飾子
長さ修飾子 | 意味 |
---|---|
hh | 対応する実引数の型が char 型であることを指定 |
h | 対応する実引数の型が short 型であることを指定 |
l | 対応する実引数の型が long 型か wchar_t 型であることを指定 |
ll | 対応する実引数の型が long long 型であることを指定 |
j | 対応する実引数の型が intmax_t 型であることを指定 |
z | 対応する実引数の型が size_t 型であることを指定 |
t | 対応する実引数の型が ptrdiff_t 型であることを指定 |
L | 対応する実引数の型が long double 型であることを指定 |
変換指定子
変換指定子 | 読取り可能な文字等 | 対応する引数 |
---|---|---|
d | 10 進整数 | 符号付き整数型へのポインタ |
i | 整数 | 符号付き整数型へのポインタ |
o | 8 進整数 | 符号無し整数型へのポインタ |
u | 10 進整数 | 符号無し整数型へのポインタ |
x | 16 進整数 | 符号無し整数型へのポインタ |
a, e, f, g | 浮動小数点数に変換する | 浮動小数点型へのポインタ |
c | フィールド幅で指定された長さの文字の並び | ※1 |
s | 非空白類文字列 | ※2 |
p | 処理系定義の文字の並びの集合 (printf関数の %p 変換で出力されるようなポインタの値) |
void へのポインタ |
n | 入力を読み取りません。 その代わり現時点までに入力ストリームから読み取った文字数がポインタに格納されます。 そのポインタは符号付き整数型へのポインタである必要があります。 |
|
% | 1 つの '%' と照合します。 | |
[...] | [ ] で囲まれたものだけを文字列として取得します。 |
※1
長さ修飾子 l (エル) の指定が無い場合: 文字列への先頭要素へのポインタ
長さ修飾子 l (エル) の指定がある場合: wchar_t 型配列 (ワイド文字列) の先頭要素へのポインタ
(Nullワイド文字は付加しない)
※2
長さ修飾子 l (エル) の指定が無い場合: 文字列への先頭要素へのポインタ
長さ修飾子 l (エル) の指定がある場合: wchar_t 型配列 (ワイド文字列) の先頭要素へのポインタ
スキャン集合指定子の利用
スキャン集合とはscanf()関数で、読み込む文字を指定する方法のことをいいます。
入力を許可する文字を制限することができます。
反対に「^」を集合の前に指定することでスキャン集合の一部ではない、つまり読み取らない文字として指定することができます。
scanf()関数にてスキャン集合指定子を使用した記述例
// scanf() program in C.
#include <stdio.h>
int main(int argc, char *args[])
{
char str[256]; // 読込バッファ
memset(str, 0x00, sizeof(str));
printf("数値を入力してください\n");
// 0~9までの数値の入力のみ許可する
scanf("%[0123456789]", str);
printf("入力された値 = %s\n", str);
return 0;
}
実行結果
scanf()関数にて入力待ち状態となります。
数値を入力してください
_
キーボードから文字列を入力します。例:12345a6789
数値を入力してください
12345a6789_
Enterを入力後、scanf()関数以降の処理が実行され、入力結果が表示されます。
スキャン集合指定子にて0~9以外の入力を制限している為、aが出現した時点で中断され、その直前までに入力した文字が格納されます。
なお、[0123456789]は[0-9]で代替可能です。
数値を入力してください
12345a6789
入力された値 = 12345
複数の入力
スペースで文字列を区切り入力することで複数の文字列を入力することが可能です。
scanf()関数にて複数の入力を行う記述例
// scanf() program in C.
#include <stdio.h>
int main(int argc, char *args[])
{
char str[256]; // 読込文字列バッファ
int i1; // 読込数値バッファ1
int i2; // 読込数値バッファ2
memset(str, 0x00, sizeof(str));
printf("加算結果の名前と加算する2つの数値を入力してください\n");
// 0~9までの数値の入力のみ許可する
scanf("%s %d %d", str, &i1, &i2);
printf("%s = %d\n", str, i1 + i2);
return 0;
}
実行結果
scanf()関数にて入力待ち状態となります。
加算結果の名前と加算する2つの数値を入力してください
_
キーボードから文字列を入力します。例:購入金額 198 1080
加算結果の名前と加算する2つの数値を入力してください
購入金額 198 1080_
Enterを入力後、scanf()関数以降の処理が実行され、入力結果が表示されます。
空白(ホワイトスペース)は区切り文字として認識され、「購入金額」、「198」、「1080」はそれぞれ「str」、「i1」、「i2」の変数に格納されます。
加算結果の名前と加算する2つの数値を入力してください
購入金額 198 1080
購入金額 = 1278
空白(ホワイトスペース)の入力
scanf()関数では、空白文字(ホワイトスペース)が区切り文字として認識される為、通常空白文字を読み込むことができません。
しかし、「^」 のあとに指定された文字は、集合から外されます。
これは空白や改行も例外ではありません。
scanf()関数にて空白文字を入力する記述例
// scanf() program in C.
#include <stdio.h>
int main(int argc, char *args[])
{
char str[256]; // 読込バッファ
memset(str, 0x00, sizeof(str));
printf("文字列をを入力してください\n");
// 改行以外の入力許可する
scanf("%[^\n]", str);
printf("入力された値 = %s\n", str);
return 0;
}
実行結果
scanf()関数にて入力待ち状態となります。
数値を入力してください
_
キーボードから文字列を入力します。例:I'm EFn.
数値を入力してください
I'm EFn._
Enterを入力後、scanf()関数以降の処理が実行され、入力結果が表示されます。
入力内容には空白文字が含まれておりますが、全て変数に格納されております。
数値を入力してください
I'm EFn.
入力された値 = I'm EFn.