「入力」について説明する前に、「変数」について話をしなければなりません。
「入力」は基本的にキーボードから行いますが、「入力」したデータを保管しておく「場所」が必要です。
「変数」とは、データを一時的に保管する「場所」だと思ってください。
「変数について」
それでは、「入力」の方法について説明します。
<sample program 003-01>
#include <stdio.h> int main(void) { int input; scanf("%d", &input); return 0; } |
入力方法もいろいろありますが、入門書などによく出ているscanfという命令を使います。
scanfはキーボードからなんらかのデータを入力する命令です。
最初の「%d」はprintfの時と同じで、10進整数で入力するという意味です。
「,(コンマ)」の後の、「&input」ですが、これが入力されたデータを保管する「場所」を表します。
コンピュータ内部でデータを保管する「場所」とはメモリのことです。
メモリ内部で「場所」を表す言葉は「番地」とか「アドレス」と呼ばれています。
「&」が「アドレス」という意味になります。
「&」の後ろの「input」が変数名になります。
このサンプルでは、「データを入力する」という意味で「input」と名付けました。
この、「&」と「input」で「inputという変数のアドレス(場所)」という意味になります。
注意:Visual Studioでは、コンパイルしたときに下のようなwarning(警告)が表示されます。 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. note: 'scanf' の宣言を確認してください 随分前に、過去に問題のあった命令(関数)についてsecure(セキュア:安全)な命令(関数)が追加されたため、 scanfは「安全でない」命令(関数)として扱われるようになりました。 本来であれば、secureなscanf_s等を使うべきかと思いますが、入門書等のテキストや他の環境では、scanfを使った例が多いため、そのままscanfを使います。 毎回警告が表示されるため、鬱陶しいと思いますので、とりあえず以下のような対処をしましょう。 プログラムの先頭「#include <stdio.h>の前」に #define _CRT_SECURE_NO_WARNINGS と追加してみてください。 これで、警告は消えるはずです。 しかし、入門書等では、このようなプログラムを先頭に書いてあるものはありませんし、他の環境で実行している方は、上記のような警告は出ません。 したがって、これ以降のサンプルにも「#define _CRT_SECURE_NO_WARNINGS」は表示しないことにしますが、鬱陶しいと思う方はプログラムの先頭に書いておいてください。 新しく追加された、secureな命令(関数)は紹介するかどうか現時点では不明です。 |
では、実行結果を見てみましょう。
実行結果
何も表示されていませんが、左上に点滅する「カーソル」があります。
この状態で、キーボードから数値を入力します。
変数は(signed)intですから整数を入力してみます。
キーボードから入力
キーボードから128と入力しました。
エンターキーを押すと次のような画面になります。
最終結果
<実行結果>
128 続行するには何かキーを押してください・・・
しかし、これでは本当に「input」という変数に128が入ったかどうか分かりません。
確かめるために「input」の中身を表示してみましょう。
<sample program 003-02>
#include <stdio.h> int main(void) { int input; scanf("%d", &input); printf("%d\n", input); return 0; } |
同じように「128」と入力してみましょう。
<実行結果>
128 128 続行するには何かキーを押してください・・・
同じ数値が2回表示されるはずです。
1回目の「128」は入力のエコーバックです。(何を入力しているのか画面に表示しないと何を打ってるのか分かりませんからね)
2回目の「128」は変数「input」の中身を表示しています。
printfで変数の中身を表示するには、前回の「出力」で行った「数値の表示」の応用でできます。
数値の代わりに「変数名」を書くだけでOKです。
これで、正しく変数「input」にデータが入っていることが分かりました。
はっきり言って非常に短いプログラムですが、短い中にも間違えることが多いので、よくある間違いについて書いておきます。
<sample program 003-03>
#include <stdio.h> int main(void) { int input; scanf("%d\n", &input); printf("%d\n", input); return 0; } |
どこが変か分かりますか?実行すれば「あれ?」と思うはずです。
前のサンプルと同じように「128」と打ち込んで、エンターキーを押してみてください。
結果が表示されませんよね?
では、そのままもう1度「128」と打ってみましょう。
<実行結果>
128 128 128 続行するには何かキーを押してください・・・
「128」が3つ表示されました。
原因は、scanfの「%d」の後の「\n(改行)」です。
printfと書式が似ているため、初心者の方は「つい」打ってしまうことが多いのです。
1回目の「128」はエコーバックです。が、この時すでに「input」にはデータが入っています。
2回目の「128」は「\n」がついているため、次のprintfに進まず、もう1度何かを入力しなければならなくなったために打ち込んだ数値です。
※ここで入力するデータは「128」でなくてもかまいません。
3回目の「128」は「input」の中身が表示されています。
これと同じ現象が出るのが、次のプログラムです。
<sample program 003-04>
#include <stdio.h> int main(void) { int input; scanf("%d ", &input); printf("%d\n", input); return 0; } |
<実行結果>
128 128 128 続行するには何かキーを押してください・・・
scanfの後に「半角スペース」が入っていますが、これが原因で前のプログラムと同じ問題が発生しています。
では、次の間違いを見てみましょう。
<sample program 003-05>
#include <stdio.h> int main(void) { int input; scanf("%d", input); printf("%d\n", input); return 0; } |
<実行結果>
Debug Error!
これは、前のプログラムよりも深刻なエラーです。
「中止」ボタンを押してプログラムを停止しましょう。
原因は、scanfの「input」の前に「&」が無いことです。
※初めての方は、本当によく忘れます。
前にも書きましたが、「&」は「場所」を表す記号ですから、これを忘れると「どこに保管していいのかわからない」状況に陥ります。
<sample program 003-06>
#include <stdio.h> int main(void) { int input; scanf("%d", &input); printf("%d\n", &input); return 0; } |
<実行結果>
128 1245024 続行するには何かキーを押してください・・・
※実行結果は毎回変化する可能性があります。
これは、printfの「input」の前に「&」をつけてしまったケースです。
「&」は「場所」を表しますから、表示されているのは、「inputという変数がある場所(メモリの番地)」になります。
「変数の場所」を知りたい時にはこれで良いのですが、中身を知りたい場合「&」は不要です。
次の例は、プログラムは正しいのですが、入力データに問題がある例です。
<sample program 003-07>
#include <stdio.h> int main(void) { int input; scanf("%d", &input); printf("%d\n", input); return 0; } |
アルファベットでaと入力してみましょう。
<実行結果>
a -858993460 続行するには何かキーを押してください・・・
とんでもない数値が表示されますね。
「%d」は10進整数を表しますので、アルファベットには対応していません。
※文字や文字列を入力するには別の方法があります。
もう1つ、
<sample program 003-08>
#include <stdio.h> int main(void) { int input; scanf("%d", &input); printf("%d\n", input); return 0; } |
10000000000(百億)と入力してみましょう。
<実行結果>
10000000000 1410065408 続行するには何かキーを押してください・・・
何か、おかしな数値が表示されていますが、「変数について」のところでも書いたように、それぞれの変数には扱える上限や下限があります。
この場合は、(signed) int型が扱える上限を超えてしまったため、おかしな数値が表示されているのです。
小数の入力をdouble型を例に書きます。
<sample program 003-09>
#include <stdio.h> int main(void) { double input; scanf("%lf", &input); printf("%f\n", input); return 0; } |
<実行結果>
123.5 123.500000 続行するには何かキーを押してください・・・
double型で「入力」する場合は、「%lf(エルエフ)」を使い、「出力」する場合は「%f」を使います。
例えば、double型で「%d」を使うとどうなるかやってみましょう。
<sample program 003-10>
#include <stdio.h> int main(void) { double input; scanf("%d", &input); printf("%d\n", input); return 0; } |
<実行結果>
123.5 123 続行するには何かキーを押してください・・・
「%d」は10進整数を表すため、最初の入力の時に小数点以下が切り捨てられます。
では、逆(int型に%lfで入力)をやってみましょう。
<sample program 003-11>
#include <stdio.h> int main(void) { int input; scanf("%lf", &input); printf("%f\n", input); return 0; } |
<実行結果>
Debug Error!
上手く表示されませんね。
このように、型に合わせて適切な記号を使用することは重要なことです。
文字や文字列の入力に関しては、「配列」の後に書きます。