scanfはキーボードから数値や文字、文字列を入力し、変数に代入します。
これもアセンブラで書こうとすると面倒な処理ですが、C言語では簡単に書けます。
ただし、scanf関数はかなりのバグや、バグを生む危険性を持っています。
使用する場合は、プログラマーも、そのプログラムを使う人も注意しないと、
暴走します。しかし、scanf関数は簡単なので、C言語の初級用の解説書などには
頻繁に出てくる関数です。当ホームページでは、後々練習問題として、scanf関数に
代わる入力関数を作ってもらう予定です。
scanf関数はprintf関数と逆の関数と思ってください。使い方も似ています。
以下に例を示します。
#include <stdio.h>
void main(){
int n;
char ch;
printf("数字を入力してください --> ");
scanf("%d", &n);
printf("文字を入力してください --> ");
scanf("%c", &ch);
printf("\n\n");
printf("入力された数字は %d です\n", n);
printf("入力された文字は %c です\n", ch);
}
|
数字を入力してください --> 10 [return]
文字を入力してください --> a [return]
入力された数字は 10 です
入力された文字は a です
|
上の例のように入力したい形式をダブルクォーテショーンで囲みます。
カンマ「,」に続いて、変数を記述します。ただし、文字列以外は
変数の前に「&」をつけます。
この「&」については、後述します。
上述したバグの例を示します。
- 数字を入力するときに、アルファベットや記号を入力する
- 1つめのscanfの時に「1 A」のようにスペースを入れる
- 数字の変数「n」を「int」型ではなく「short」型で宣言する
これらの場合、コンパイラなどにより症状はかわりますが、
おそらくプログラマーの期待する動作とは異なる動作をしたり、暴走したりする
でしょう。(以降、「コンパイラやOSによって・・・」というのを「処理系の違いによって・・・」と
表現します。)
printfではいろいろな(10進数とか16進数とか、小数とか)型を表示できました。
scanfでも以下のような変換指定文字が用意されており、いろいろな型を入力できます。
変換指定文字 |
機 能 |
d |
整数を10進数で入力 |
x |
整数を16進数で入力 |
o |
整数を8進数で入力 |
e |
小数を指数形式で入力 |
f |
小数を実数形式で入力 |
c |
変数を1文字として入力 |
s |
文字列を入力 |
p |
ポインタ |
また、scanfでは複数の値を入力することもできます。以下に例を示します。
#include <stdio.h>
void main(){
int n1, n2;
char ch;
printf("数字を2つ入力してください --> ");
scanf("%d %d", &n1, &n2);
printf("\n\n");
printf("入力された数字は %d と%d です\n", n1, n2);
}
|
数字を2つ入力してください --> 10 100[return]
入力された数字は 10 と 100 です
|