scanfで入力

値をプログラムの外から受け取る

ここまでは点数をソースコードに直接書いていました。これでは点数を変えるたびにコンパイルし直すことになり、成績管理アプリとしては使えません。キーボードから打った値を受け取るには scanf を使います。

scanf の書き方

int score; scanf("%d", &score);

第1引数は printf と同じ書式指定子です。%d なら「整数として読む」という意味になります。第2引数から先が、読んだ値を入れる変数です。

& はいまはおまじないとして付ける

printf のときは printf("%d", score) と変数名をそのまま書きました。ところが scanf では &score と、変数名の前に & が付きます。

いまは「scanf に変数を渡すときは前に & を付ける」と覚えてください。理由は第7章で分かります。 そこで & の正体を説明し、なぜ printf には要らないのに scanf には要るのかがつながります。ここで無理に意味を考える必要はありません。

大事なのは、付け忘れてもコンパイラが止めてくれるとはかぎらないことです。& を落とすと、入力した値が変数に入らないまま先に進んだり、プログラムが途中で落ちたりします。値がおかしいときは、まず & を疑ってください。

複数の値をまとめて読む

書式指定子を並べれば、いくつでも読めます。

int kokugo, suugaku; scanf("%d %d", &kokugo, &suugaku);

scanf は数字の前にある空白や改行を読み飛ばします。そのため 78 92 と1行で打っても、78 と 92 を2行に分けて打っても、どちらも同じように読めます。

double を読むときは %lf

ここが printf との違いです。double を 出す ときは %f ですが、読む ときは %lf を使います。

double rate; scanf("%lf", &rate); /* 読むときは %lf */ printf("%.1f\n", rate); /* 出すときは %f 系 */

scanf("%f", &rate) と書くと、double の箱に float のつもりで書き込むので値が壊れます。ここは理屈より、読むときは %lf、と決めて覚えるほうが早いです。

入力を促す文を出すかどうか

実際のツールなら「点数を入力してください」と先に出したいところです。ただ、この講座の採点はあなたのプログラムの出力を1文字ずつ突き合わせるので、問題文に書かれていない行を出すと不合格になります。促す文を出すのは、問題文で求められたときだけにしてください。

読めなかったときのこと

scanf は、読み取れた個数を戻り値として返します。数字を打つべきところに文字が来ると読み取りに失敗し、変数の中身は前のままになります。入力が正しい前提で書けるうちは気にしなくてかまいませんが、C の入力処理には「失敗する」という状態があることだけ頭の隅に置いてください。第8章のファイル読み込みで、この考え方をもう一度使います。

要件

  1. 点数は int の変数に scanf で読む
  2. 出席率は double の変数に scanf で読む
  3. 「点数は78点です」「出席率は0.8です」の形で2行出す
  4. 出席率は小数点以下1桁で出す

入出力例

main("78 0.8") → "点数は78点です 出席率は0.8です" main("92", "0.5") → "点数は92点です 出席率は0.5です"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.c
学習モード

メモ

scanfで入力

⌘S で保存