Thinkers'Studio
JavaとC言語の自習ツール
scanf の使い方、考え方

 キーボードから値を入力するときに使う scanf関数は、これまでの Tips でも使ってきました。
 最初のうちは使い方が分かりにくいので、今回は例題で説明します。 次回は電卓プログラムに発展させることにします。

scanf の形式 】
 int scanf( 書式を指定する文字列, ・・・ )
  • 最初の引数に指定した書式に従って変換し、2番目以降の引数(変数のアドレスを渡す)に入れる
  • 書式文字列の最後まで行くか、入力がそれと合わなくなったところで停止する
  • 戻り値は入力に成功した個数

scanf の書き方を見るための課題

 『2つの浮動小数点数を指定すると、その和を求めて表示するプログラムを書きなさい。』
 処理手順は次の通りです。
  1. キーボードから 2つの浮動小数点数を入力する (変数 x, y へ)
  2. もし、入力エラーがあったら、エラーメッセージを表示して終了する
  3. x + y の結果を表示する

scanf に書式を指定する文字列を考えます

 入力データによって変換文字が決められているので、それを調べます。
 変数 x, y は、double型としましょう。 double型へ入力するための変換指定文字は "%lf" です。
 2つの値の区切りは、カンマにしましょうか。 すると、scanf に渡す第1引数は "%lf, %lf" です。

受け取る変数のアドレスを渡します

 第2引数以降に、x, y のアドレスを渡します。
 変数のアドレスを渡すには変数名の前に & を付けます。すると、scanf 呼び出しはこうなります。
 scanf( "%lf, %lf", &x, &y )

戻り値で入力が成功かどうかを調べましょう

 ここでは入力するデータの個数が 2 なので、戻り値も 2 であれば成功です。
 int 型の retc という変数に戻り値を受け取って、それを判定するならこうです。
 retc = scanf( "%lf, %lf", &x, &y );
 if( retc != 2 ) { //エラー処理 }
 わざわざ retc に受け取らなくても、戻り値を直接判定すると、次のように短く書けます。
 if( scanf( "%lf, %lf", &x, &y ) != 2 ) { //エラー処理 }

プログラム全体はこうなります。
scanf を使うプログラム例 】
#include <stdio.h>
#include <stdlib.h>

main()
{
    double x, y;
    
    printf( "2つの数の和を求めます(x, yを指定): " );
    if( scanf( "%lf, %lf", &x, &y ) != 2 ) {
        printf( "指定が正しくありません\n" );
        exit( 1 );
    }
    printf( "x + y = %g\n", x + y );
}

scanf 関数を使うときは

 入力したいデータの型や個数に応じて、scanf に渡す内容を変えればよいですね。変換指定文字を正しく選ぶこと、受け取る変数もそれに対応させて正しくアドレスを指定すること、そして戻り値を調べて入力エラーに対処することが大切です。

  (今回のクイズ)  次のような入力をしたい場合、scanf 呼び出しはどのように書けばよいでしょう?
  (1) char msg[24]; に文字列を入力する
  (2) char moji; にひと文字を入力する
  (3) int yy, mm, dd; の各変数に10進の整数を入力する
   (答えは、次回のC言語の Tips で ・・・)

[ 関連記事 ] 入力時に要らないデータをスキップする
(以下は scanf の利用例の参考に) 表示用マクロ, 曜日を調べる, 最大公約数を求める, 数字当てゲーム 四捨五入

前回のクイズの答え: prtQue 関数は例えば次のようにします。 (前回の問題を見る
void prtQue()
{
    int i;

    printf( "(head:%d,tail:%d) ", head, tail );
    for( i = head; i < tail; i++ ) printf( "[%d]%d ", i, queue[i] );
    printf( "\n" );
}