![]() |
|
キーボードから変数に代入するには?scanf関数と変数の型の関係を知る scanf関数の使い方キーボードから変数に数値を代入する、これができるとプログラムの実用度が飛躍的にアップします。これを実現するにはscanf関数を使います。printf関数に似ているので、とっつきやすいでしょう。
このプログラムを実行すると、カーソルが出てくるので、そこで適当な数値(文字はいけません)を入力して、Enterキーを押します。すると、入力した数値が表示されます。 ここで、scanf関数で「&i」を指定していることに気をつけてください。つまり、scanf関数には「変数iのアドレス」を渡しているのです。なぜそんなことをしているのでしょうか。それは、変数iのアドレスを知って、そのアドレスに書き込むとによって変数iの内容を変えることができるからです。変数名を知ってもしかたがありません。必要なのはその実体がある「アドレス」なのです。 しかし、「&」を取り除いても、コンパイルはできます。でもこれを実行するのは危険です。なぜなら、&を取り除いた場合は、「変数iの内容がアドレスとして」scanf関数に渡されてしまうからです。もちろん、変数iの内容はまず変わることはありません。これは、初めてscanf関数を使ってもっとも起こしやすいエラーの一つですので、気をつけてください。 余談:
変数の型にあわせるしかし、これで完璧ではありません。もしint型ではなく、long型、double型等を使いたい時はそれに応じてscanf関数に指定する%のあとに続く文字を変えなくてはいけません。以下の例を参考にしてください。
ちょっと見れば分かりますが、double型などの実数は、printf関数では「%f」で表示できますが、scanf関数では float型は「%f」、double型は「%lf」を使います。 また、ここでは新しい文字列の指定方法を示しています。最後のprintf関数ですが、指定する文字列が長いため、このように二行に分けています。これはprintf関数の機能ではなく、文字列の仕様です。このように分けて書いても、一つの文字列とみなされます。 実行例:(水色の文字は入力した文字です)
さてここで、「Input integer:」と出たら、「A1 2 3 4」と打ってみてください。
一気にプログラムが終了してしまいました。実は文字を入力すると、ある場所に「キーボードバッファ」と言う物が作られ、そこに打たれた文字は「溜まって」いきます。そして、scanfは、スペースやリターン(実はリターンも'\n'という文字です)等の空白文字を区切りとして扱い、キーボードバッファから文字列を持ってきます。 実は、リターンキーは、区切り文字にすぎなかったのです。 だから、「A1 2 3 4」と打つと、いきなりプログラムが終了したわけです。じつは、最後の'4'のあとに打ったリターン'\n'の分はまだキーボードバッファに残っています。上のコードの最後に scanf("%c",&c);
とすると、cには'\n'が入ります。 さて、scanf関数に指定する文字列に、2つ以上「%」を入れるとどうなるのでしょうか。たとえば、 scanf("%d %d",&i1,&i2);
です。これはこれでちゃんと働きます。二回に分けて入力を求めてきます。ここで「10 20」と空白で区切って入力すると、やはり一度にi1とi2に、10と20が入ります。 まとめ。
(1997/02/03 公開, 1999/03/13 改) |
![]() |
著作権は全て小出 俊夫にあります。KID's World © 1996-2003 Toshio Koide.