ログイン
kid's world

数値を得る

scanf関数

数値を得る

次に,数値を得る方法について解説しよう。「ユーザに数値を入力してもらい,その値に応じていろいろな計算を行う」ということは,よくあることだ。

数値を得るには,scanf関数を使う。この関数は,printf関数のように「%d」や「%c」といった形式文字列を1番目の引数に与え,2番目以降の引数に,変数の「アドレス」を渡す。たとえば,ユーザが入力した整数を変数iに入れるには,

scanf("%d",&i);

とする。List 6にその例を示そう。

List 6: キーボードから数値を得る

#include <stdio.h>

main()
{
  int i;
  
  scanf("%d", &i);
  printf("入力された数値は、%dです。\n", i);
}

List 6は非常に簡単な例だが,ユーザが入力した数値をそのまま表示する例だ。ただ,一度数値になっているので,たとえば「0123」と入力すると画面には「123」と表示されることがわかると思う(Fig. 4)。

Fig. 4: List 6の実行例

0123   <-------------------入力した文字
入力された数値は、123です。

ここで,scanf関数には,変数の「アドレス」を渡していることに注意していただき

たい。前回はポインタに関する話題を取り扱ったが,そこで変数のアドレスを知れば,その変数の内容を書き換えることができることを解説した。scanf関数に「変数の値」を渡しても意味がない。「変数のアドレス」を渡すことによって,scanf関数の内部では,そのアドレスを使って,変数にバッファに蓄えられた文字を数値に変換して書き込んでいるのだ。

だから,間違っても「scanf(”%d”, i);」と書いてはならない。これはコンパイル時にエラーにならないので,注意してもらいたい。変数iの内容を渡してしまうと,scanf内部ではそれをアドレスと思って処理しているので,とんでもないメモリ領域に書き込んでしまうことがあるのだ(Fig. 5)。

Fig. 5: List 6の実行イメージ

/c/input-fig5.png

文字を得る

getchar関数で文字を得ることができるが,scanf関数でも文字を得ることができる。変換文字として「%c」を指定するだけでよい。

つまり,

c=getchar();

は,

scanf("%c", &c);

としても同じである。これは数値と文字を

同時に入力してもらいたいときに使うと便

利である。たとえば,「130B」という数値

と文字が混ざった文字列を入力してもら

い,それを130とBというべつべつの数値

と文字として得たい場合は,List 7のように

書く。List 7を実行して,「130B」と入力し

た結果をFig. 6に示そう。

Fig.6: List 7の実行例

130B   <-------------------入力した文字
数値の部分: 130
文字の部分: B

このように,scanf関数は入力された数値や文字を一括して処理できる。この関数に使える変換文字のうち,主なものをTable 3に示しておこう。

Table 3: scanf関数の変換文字

/c/input-table3.png

scanf関数は,1文字得るための「%c」を除

いて,データを空白文字で区切って処理す

る。空白文字とは,’(スペース),’\t’,

’\n’,’\r’,’\v’,’\f’のことである。

よって,変換文字に「%d%d」と指定してあった場合,「10」「20」と1行ずつ入力しても,「10 20」とスペースで間を空けて指定しても同じことなのだ。List 8はそれを確認するためのプログラムである。

List 8: 実数を3つ得て表示する

#include <stdio.h>

main()
{
  float f[3];
  
  printf("実数を3つ入力してください。\n");
  scanf("%f%f%f", &f[0],&f[1],&f[2]);
  printf("%f, %f, %f\n", f[0],f[1],f[2]);
}

プログラム自体は非常に簡単で説明するまでもないが,注目してほしいのは,実行例である。Fig. 7は,素直に3つの実数を3行にわたって入力した例である。

Fig.7: List 8の実行例(1)

実数を3つ入力してください。
1.4142135   <-------------------入力した文字
1.7320508   <-------------------入力した文字
2.2360679   <-------------------入力した文字
1.414214, 1.732051, 2.236068

次にFig. 8であるが,これはちょっと意地悪して,1つ目と2つ目の実数を,スペースで区切って1行で入力した例である。これでも同じような結果となっている。

Fig.8: List 8の実行例(2)

実数を3つ入力してください。
1.4142135 1.7320508   <-------------------入力した文字
2.2360679   <-------------------入力した文字
1.414214, 1.732051, 2.236068

Fig. 7のときとFig. 8のときの入力バッファの使われ方をFig. 9に示す。このことから,改行「'\n'」も,スペース「' '」も,どちらも同じく空白文字としてデータの区切りに使われていることがわかるだろう。

Fig.9: List 8の入力バッファの使われ方

/c/input-fig9.png


円周と面積を表示する」へ進む

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告