KID's World
 

おしながき
トップページ
プログラミング
研究
いんすぴ
色日記
ソフトウェア
KID's Worldの歴史
リンク
小出俊夫について


キーボードから変数に代入するには?

scanf関数と変数の型の関係を知る

 

scanf関数の使い方

 キーボードから変数に数値を代入する、これができるとプログラムの実用度が飛躍的にアップします。これを実現するにはscanf関数を使います。printf関数に似ているので、とっつきやすいでしょう。

 
#include <stdio.h>

main()
{
  int i;
  scanf("%d", &i);
  printf("%d\n",i);
}

 このプログラムを実行すると、カーソルが出てくるので、そこで適当な数値(文字はいけません)を入力して、Enterキーを押します。すると、入力した数値が表示されます。

 ここで、scanf関数で「&i」を指定していることに気をつけてください。つまり、scanf関数には「変数iのアドレス」を渡しているのです。なぜそんなことをしているのでしょうか。それは、変数iのアドレスを知って、そのアドレスに書き込むとによって変数iの内容を変えることができるからです。変数名を知ってもしかたがありません。必要なのはその実体がある「アドレス」なのです。

 しかし、「&」を取り除いても、コンパイルはできます。でもこれを実行するのは危険です。なぜなら、&を取り除いた場合は、「変数iの内容がアドレスとして」scanf関数に渡されてしまうからです。もちろん、変数iの内容はまず変わることはありません。これは、初めてscanf関数を使ってもっとも起こしやすいエラーの一つですので、気をつけてください。

余談:

変数iはint型ですから、int型の有効範囲を超える数値は記憶できません。たとえば、「65535」としてみてください。画面にはどんな数字が出てきましたか?「−1」と出てきたら、int型が16bitである証拠です。もし「65535」がそのまま表示されたなら、32bitかそれ以上です。このようにビット数は処理系によって異なります。DOSプログラムを作るLSI-C86では16bit、Windows95/NTのプログラムを作るVisual C++ 4.0では32bitになっています。

 

変数の型にあわせる

 しかし、これで完璧ではありません。もしint型ではなく、long型、double型等を使いたい時はそれに応じてscanf関数に指定する%のあとに続く文字を変えなくてはいけません。以下の例を参考にしてください。

 
#include <stdio.h>

main()
{
  char c;
  int i;
  long l;
  float f;
  double d;

  printf("Input character:");      /* 文字 */
  scanf("%c", &c);

  printf("Input integer:");        /* 整数型 */
  scanf("%d", &i);

  printf("Input long integer:");   /* 長い整数型 */
  scanf("%ld", &l);

  printf("Input float:");          /* 実数 */
  scanf("%f", &f);

  printf("Input double:");         /* 倍精度の実数 */
  scanf("%lf", &d);

  printf("\nCharacter = %c\nInteger = %d\nLong integer = %ld\n"
	     "Float = %f\nDouble = %f\n",c,i,l,f,d);
}

 ちょっと見れば分かりますが、double型などの実数は、printf関数では「%f」で表示できますが、scanf関数では float型は「%f」、double型は「%lf」を使います。

 また、ここでは新しい文字列の指定方法を示しています。最後のprintf関数ですが、指定する文字列が長いため、このように二行に分けています。これはprintf関数の機能ではなく、文字列の仕様です。このように分けて書いても、一つの文字列とみなされます。

実行例:(水色の文字は入力した文字です)


Input character:A
Input integer:100
Input long integer:12345678
Input float:3.14
Input double:3.1415926535

Character = A
Integer = 100
Long integer = 12345678
Float = 3.140000
Double = 3.141593

 さてここで、「Input integer:」と出たら、「A1 2 3 4」と打ってみてください。

 
Input character:A1 2 3 4
Input integer:Input long integer:Input float:Input double:
Character = A
Integer = 1
Long integer = 2
Float = 3.000000
Double = 4.000000

 一気にプログラムが終了してしまいました。実は文字を入力すると、ある場所に「キーボードバッファ」と言う物が作られ、そこに打たれた文字は「溜まって」いきます。そして、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が入ります。

 

まとめ。

  1. キーボードから数値を入力するには、scanf関数を使う。
  2. scanf関数には変数のアドレスを指定する。
  3. double型は「%lf」、float型は「%f」を指定する。
  4. scanf関数は、空白文字を区切りとみなす。

(1997/02/03 公開, 1999/03/13 改)

[目次へ] [次へ]

 著作権は全て小出 俊夫にあります。KID's World © 1996-2003 Toshio Koide.

 対応ブラウザについて