C言語で、ユーザから入力を受け付けたり、ユーザに文字を表示する方法を説明します。

おまじない

最初に、このソースコードをみてください。

#include <stdio.h>

int main(void)
{

    return 0;
}

これは、おまじないと呼ばれる、初めてC言語を勉強する上で意味を理解せずに、とりあえず覚えておくものです。

なので、これはどういう意味なのかということは考えないでください。

なぜ意味を理解せずに覚えておかなければならないのかというと、これからC言語を勉強していく上で、ほぼ必ずといってもいいほど書かなくてはならない部分だからです。

コメント

ソースコード中には、コメントと呼ばれるものを書くことができます。

コメントは、コンパイル時にプログラムに変換されません。そのため、ソースコード中に、ソースコードをみただけでは分からないような部分に説明を書いたり、ソースコードで実行したくない部分をコメントとして、実行させないようにしたりできます。

コメントの書き方は2種類あり、どちらを利用しても構いません。

#include <stdio.h>

int main(void)
{
    // ここはコメントです
    // コメントにしたい部分の先頭文字の前から
    // スラッシュを2つ書くことで、スラッシュの後ろの行がコメントになります

    /* さらに、ここのコメントのように、コメントの先頭にスラッシュにアスタリスクを書いて、
    コメントの末尾に、アスタリスクとスラッシュを書くことで、
    スラッシュ2とは違い、複数行のコメントを書くことができます。 */

    // printf("Hello world\n");

    return 0; // ここもコメント
}

具体的にどのようなものかは、ソースコード中のコメントとして書いてあります。

このソースコードを元にプログラムを実行すると、何も表示されません。

入出力とは

では、おまじないとコメントについて覚えた上で、入出力の方法を説明していきます。

入出力とは、入力と出力を合わせた言葉で、その名の通り、入力と出力を表します。

プログラムでは、ユーザからマウスやキーボードなどからの操作を入力として受け付けて、それを元にディスプレイなどに文字などを出力するのが一般的です。

例えば、電卓であれば、数字を入力として受け付けて、その数字を元に計算してディスプレイに出力します。

ここでは、キーボードからの数字を入力として、文字に関しては、ここでは後で説明します。

出力

最初に、出力について説明します。

では、このソースコードを実行してみましょう。

#include <stdio.h>

int main(void)
{
    printf("Hello world\n");

    return 0;
}

これを実行すると、Hello world と表示されるはずです。

実は、これは前回の「実行方法」でも紹介したものでもあります。

そして、気づいて欲しいのが、上記のおまじないとして紹介したソースコードの「return 0;」の上の行に、「printf(“Hello world\n”);」という文が追加されているということです。

このように、これから紹介するソースコードのほとんどが、「return 0;」の上の行に、文を追加していくということを覚えておいてください。

では、このソースコードではどのようなことをしているのか説明していきます。

まず最初に、ソースコードの見方について説明します。

基本的に、ソースコードは、上から順に見ていきます。何故なのかというと、プログラムは、上から順に実行されるからです。

上から順に見て行った時に、一番上にあるのは「printf(“Hello world\n”);」です。

「printf関数」というものを使って、“Hello world"という文字列を表示しています。

表示する文字列は、ダブルクォート(”")の中に書きます。

なので、Good afternoon と表示したければ、このようにします。

#include <stdio.h>

int main(void)
{
    printf("Good afternoon\n");

    return 0;
}

このようにダブルクォートの中を変更して、表示する文字列を変更します。

文字列の最後に"\n"というものがありますが、これは普通の文字とは違いエスケープシーケンスと呼ばれるもので、特別な意味を持っています。 エスケープシーケンスはいくつかありますが、ここでは"\n"を覚えておきましょう。 “\n"は、改行をするためのエスケープシーケンスで、基本的にprintf関数で表示する文字列の最後には、これを書いて改行をしておくようにしましょう。 改行をするということで、2行の文字列を表示したい場合はこのようにします。

#include <stdio.h>

int main(void)
{
    printf("Hello world\nGood afternoon\n");

    return 0;
}

途中で、"\n"を書きます。 このようにprintf関数を複数書いても大丈夫です。

#include <stdio.h>

int main(void)
{
    printf("Hello world\n");
    printf("Good afternoon\n");

    return 0;
}

C言語では、文字と文字列という言葉の意味が厳格に分けられています。 文字とは、1つの文字のことを表し、文字列とは、その文字が複数集まったものです。 なので今後、複数の文字からなるものは、文字列と表現します。

入力

ユーザから、数字を入力として受け取ってみましょう。

このソースコードを元にプログラムを実行してみましょう。

#include <stdio.h>

int main(void)
{
    int a;

    scanf("%d", &a);
    printf("入力された数値は%dです\n", a);

    return 0;
}

実行の時には、実行中になんでもいいので、数字を入力してエンターキーを押してください。

そうすると、例えば 3 という数字を入力した時には「入力された数値は3です」と表示します。

5 と入力した場合は、「入力された数値は5です」と表示します。

どのようにして、入力を受け取っているのかというと、上の「int a;」と「scanf("%d”, &a);」に秘密があります。

int a; という部分では、入力された数字を受け取るための「変数」と呼ばれるものを用意しています。今回、この変数は「a」という名前で変数を用意しています。

変数の名前には、英数字を使うことができますが、数字のみの変数を作ることはできません。

イメージとして、aという名前の箱を用意している様子を思い浮かべるといいと思います。

variable-box.png

scanf("%d", &a); という部分では、ユーザからの入力を受け付けて、入力された数値を、a という名前の変数に入れるということを示しています。

イメージとして、用意しておいたaという名前の箱に、入力した数値を入れていると考えましょう。

insert-number.png

printf(“入力された数値は%dです\n”, a); という部分では、出力の説明でも触れたprintf関数というものを使っており、%d という部分に変数a の値を入れて表示しています。

イメージとして、カンマ(,)で区切って書いた a という名前の箱から数値を取り出して、それを %d と置き換えて表示していると思いましょう。

pull-number.png

変数から値を取り出す操作を「参照」や「アクセス」という言葉で表します。

重要なのは、入力された数値を覚えておくために、変数というものを使っているということです。

入力された数値は必ず変数を使って保持している必要があります。

具体的にどのようなルールなのか、見ていきましょう。

変数は、ほとんどの場合において、ソースコードとして追加する部分の一番上に書いて、変数の用意をしておく必要があります。用意していない変数は使うことができません。

そして、変数は「int」の後に空白を開けて英数字で指定して用意します。

このように、カンマで区切ったり、int を複数書いたりして、複数の変数を用意することができます。

#include <stdio.h>

int main(void)
{
    int a, b;
    int c;

    scanf("%d", &a);
    printf("入力された数値は%dです\n", a);

    return 0;
}

変数が一つだけであることはほとんどないので、覚えておきましょう。

scanf関数では、数値の入力を受け付けますが、その入力された数値を変数aに入れるという指定は、ダブルクォートの後にカンマで区切って、変数名の前にアンパサンド(&)をつけて &a というように書いて指定しています。

その前のダブルクォートで囲まれている %d というのは、整数を入力として受け取ることを示しています。

なので、scanf("%d", &a); というのは、入力として整数を受け取り、その値を変数aに入れるということを表しています。

printf関数は、上記でも説明したように、ダブルクォートで囲ったものを出力します。

しかし、%d などの特殊な文字列が存在する場合は、それをダブルクォートの後のカンマで区切られた変数の値に変換して表示されます。

小数

int の後に変数の名前を指定している場合、その変数には整数の値しか入れることができません。

なので、小数や文字列を変数として扱いたい場合は、それにあった変数を用意する必要があります。

文字列については、今後別のページで説明するので、ここでは説明せず、代わりに小数の説明をします。

整数の代わりに小数を変数として使いたい場合は、int の代わりに double を使う必要があります。

この int や double のようなものを「変数の型」もしくは単に「型」といい、変数の種類を決めるものになります。ちなみに、int で作られた変数のことを「int 型」と言ったり、double で作られた変数のことを「double 型」と言うように、どの型の変数かを表す時には、型の名前の後ろに型と言う言葉ををつけて呼びます。

前のソースコードを、整数ではなく小数を入力として受け付けることができるようにすると、このようになります。

#include <stdio.h>

int main(void)
{
    double a;

    scanf("%lf", &a);
    printf("入力された数値は%fです\n", a);

    return 0;
}

整数のものとの違いはこのようになっています。

  • int の代わりに double を使用
  • scanf関数には %d の代わりに %lf
  • print関数には %d の代わりに%f

重要なのは、double を使うこと、入力であるscanf関数では %lf を使うこと、出力であるprintf関数では %f を使うことです。

int の場合、scanf関数もprint関数も、%d と共通のものを使えましたが、double の場合、scanf関数では %lf 、printf関数では %f と違うので、混同しないようにしましょう。

ちなみに、double は小数を扱うものなので、int で表現できる整数も表現できます。しかし、その変数で整数のみしか扱わないのであれば、整数しか使わないということを明示する(わかりやすく示す)ために、なるべく int を使うようにしましょう。

最後に、整数と小数を入力するソースコードを紹介します。

#include <stdio.h>

int main(void)
{
    int a;
    double b;

    printf("整数を入力してください: ");
    scanf("%d", &a);
    printf("小数を入力してください: ");
    scanf("%lf", &b);

    printf("入力された整数は%dです\n", a);
    printf("入力された小数は%fです\n", b);

    return 0;
}

このソースコードでは、整数と小数の2つを入力として受け付けて、それぞれ表示するというものです。

今までの整数を入力として受け付けて表示するものと小数を入力して受け付けて表示するものを足したものになります。

複数の入力

ひとつのscanf関数で複数の入力を受け取ることができます。

複数の入力を受け取るには、入力を受け付ける数だけ %d や %lf を書き、カンマで区切って %d や %lf の数だけ変数を書きます。

#include <stdio.h>

int main(void)
{
    int a;
    double b;

    printf("整数と小数を入力してください: ");
    scanf("%d%lf", &a, &b);

    printf("入力された整数は%dです\n", a);
    printf("入力された小数は%fです\n", b);

    return 0;
}

この場合、整数と小数は、「3 4.5」のように空白で区切って入力してもいいですし、それぞれの数字ごとにエンターキーを押して入力しても構いません。

%d や %lf と変数名の順番通りに値が格納されます。

出力の整形

小数を表示した際に、小数部分の0が大量に表示されて違和感を感じたと思います。

printf関数を使って整数や小数を表示する時に、自分自身で表示する部分の指定をすることが可能です。

#include <stdio.h>

int main(void)
{
    int a;
    double b;

    printf("整数と小数を入力してください: ");
    scanf("%d%lf", &a, &b);

    printf("入力された整数は%3dです\n", a);
    printf("入力された小数は%.2fです\n", b);

    return 0;
}

a 実行すると、整数は3桁、小数は、小数部分2桁まで表示されます。

これらの桁の指定は %d や  %f を書き換えて指定しています。

整数の場合は、% と d の間に表示したい桁数を指定します。3桁の場合に1桁や2桁の数字を表示しようとすると、左側に空白が入り、空白を含めて3桁で表示しようとします。

「%03d」のように0をつけると、空白ではなく0を使って桁を揃えます。

小数の場合は、% と f の間に表示したい桁数を指定します。小数部分を2桁まで表示したい場合は、「%.2f」のようにドットの後に桁数を書きます。小数部分は2桁、小数とドットと整数部分を含めて5桁で表現したい場合は「%5.2f」のように、ドットの前に全体の桁数を書きます。

まとめ

今回は、入力と出力を説明しました。

入力と出力はプログラムにおける基本となります。

scanf関数とprintf関数の使い方をなるべく覚えるようにしましょう。

しかし、まだどのようにソースコードを書いていけばいいか、分からないという人の方が多いと思います。

その場合は、ここで紹介したソースコードの一部を書き換えながら、どのようにプログラムの結果が変わるのか確認してみましょう。

そうすると、より学習したことが身につきやすくなり、これからの学習の役に立つはずです。