【C言語】複数の変数に1つのscanf関数で入力する方法

C言語でプログラムを作成する際、ユーザーからの入力を受け取ることは非常に重要です。

特に、複数のデータを一度に入力する方法を知っておくと、プログラムがより効率的で使いやすくなります。

この記事では、scanf関数を使って複数の変数に入力する方法や、その際の注意点、さらに配列や構造体、ファイルからの入力方法についても詳しく解説します。

目次から探す

複数の変数に入力する方法

C言語では、ユーザーからの入力を受け取るためにscanf関数を使用します。

scanf関数は、標準入力(通常はキーボード)からデータを読み取り、指定された変数に格納します。

この記事では、複数の変数に対して1つのscanf関数を使って入力を受け取る方法について詳しく解説します。

複数の変数を扱う理由

プログラムを作成する際、複数のデータを同時に扱うことがよくあります。

例えば、ユーザーの名前と年齢を同時に入力させたい場合や、2つの数値を入力してその和を計算する場合などです。

複数の変数に対して一度に入力を受け取ることで、コードが簡潔になり、ユーザーの操作も簡単になります。

複数の変数に入力するための基本構文

scanf関数を使って複数の変数に入力を受け取る基本的な構文は以下の通りです。

scanf("フォーマット指定子", &変数1, &変数2, ...);

ここで、フォーマット指定子は入力されるデータの型を指定し、&変数は入力されたデータを格納する変数のアドレスを指定します。

例えば、整数型の変数abに対して入力を受け取る場合、以下のように記述します。

int a, b;
scanf("%d %d", &a, &b);

このコードは、ユーザーが2つの整数を入力し、それぞれabに格納することを意味します。

フォーマット指定子の連続使用

scanf関数では、複数のフォーマット指定子を連続して使用することができます。

これにより、異なる型のデータを一度に入力することが可能です。

例えば、整数型と浮動小数点型の変数に対して入力を受け取る場合、以下のように記述します。

int a;
float b;
scanf("%d %f", &a, &b);

このコードは、ユーザーが1つの整数と1つの浮動小数点数を入力し、それぞれabに格納することを意味します。

以下に、実際のサンプルコードとその実行結果を示します。

#include <stdio.h>
int main() {
    int a;
    float b;
    printf("整数と浮動小数点数を入力してください(例: 5 3.14): ");
    scanf("%d %f", &a, &b);
    printf("入力された整数: %d\n", a);
    printf("入力された浮動小数点数: %.2f\n", b);
    return 0;
}

このプログラムを実行すると、以下のような出力が得られます。

整数と浮動小数点数を入力してください(例: 5 3.14): 5 3.14
入力された整数: 5
入力された浮動小数点数: 3.14

このように、scanf関数を使って複数の変数に対して一度に入力を受け取ることができます。

これにより、プログラムの効率が向上し、ユーザーの操作も簡単になります。

入力時の注意点

入力の区切り文字

scanf関数を使用して複数の変数に入力する際、入力の区切り文字に注意が必要です。

通常、scanf関数は空白文字(スペース、タブ、改行)を区切り文字として認識します。

例えば、以下のコードでは、スペースで区切られた2つの整数を入力します。

#include <stdio.h>
int main() {
    int a, b;
    printf("2つの整数をスペースで区切って入力してください: ");
    scanf("%d %d", &a, &b);
    printf("入力された値: a = %d, b = %d\n", a, b);
    return 0;
}

このプログラムを実行すると、次のように入力できます。

2つの整数をスペースで区切って入力してください: 10 20
入力された値: a = 10, b = 20

このように、スペースで区切ることで複数の変数に値を入力できます。

入力エラーの処理

scanf関数は、入力が期待した形式と異なる場合にエラーを返します。

エラーが発生した場合、scanf関数は読み取った項目の数を返します。

例えば、2つの整数を入力する際に文字を入力してしまった場合、scanfはエラーを返します。

以下のコードは、入力エラーを処理する例です。

#include <stdio.h>
int main() {
    int a, b;
    printf("2つの整数をスペースで区切って入力してください: ");
    if (scanf("%d %d", &a, &b) != 2) {
        printf("入力エラーが発生しました。\n");
        return 1;
    }
    printf("入力された値: a = %d, b = %d\n", a, b);
    return 0;
}

このプログラムを実行し、誤った形式で入力すると次のようになります。

2つの整数をスペースで区切って入力してください: 10 abc
入力エラーが発生しました。

このように、scanf関数の戻り値をチェックすることで、入力エラーを適切に処理できます。

バッファのクリア方法

scanf関数を使用する際、入力バッファに残った不要なデータが次の入力に影響を与えることがあります。

これを防ぐために、入力バッファをクリアする方法を知っておくことが重要です。

以下のコードは、入力バッファをクリアする方法の一例です。

#include <stdio.h>
int main() {
    int a, b;
    char c;
    printf("1つの整数を入力してください: ");
    scanf("%d", &a);
    // 入力バッファをクリア
    while ((c = getchar()) != '\n' && c != EOF);
    printf("もう1つの整数を入力してください: ");
    scanf("%d", &b);
    printf("入力された値: a = %d, b = %d\n", a, b);
    return 0;
}

このプログラムでは、最初の整数を入力した後、getchar関数を使用して入力バッファをクリアしています。

これにより、次の入力が正しく処理されます。

1つの整数を入力してください: 10
もう1つの整数を入力してください: 20
入力された値: a = 10, b = 20

このように、入力バッファをクリアすることで、次の入力が正しく処理されるようになります。

応用例

配列への入力

配列に対して複数の値を一度に入力することも可能です。

例えば、整数型の配列に対して複数の値を入力する場合、以下のようにします。

#include <stdio.h>
int main() {
    int arr[3];
    printf("3つの整数を入力してください: ");
    scanf("%d %d %d", &arr[0], &arr[1], &arr[2]);
    printf("入力された値は: %d, %d, %d\n", arr[0], arr[1], arr[2]);
    return 0;
}

このプログラムでは、ユーザーが3つの整数を入力すると、それぞれが配列 arr の要素に格納されます。

入力された値はその後、出力されます。

実行結果

3つの整数を入力してください: 10 20 30
入力された値は: 10, 20, 30

構造体への入力

構造体を使って複数の変数を一度に入力することもできます。

例えば、学生の情報(名前、年齢、成績)を入力する場合、以下のようにします。

#include <stdio.h>
struct Student {
    char name[50];
    int age;
    float grade;
};
int main() {
    struct Student student;
    printf("名前、年齢、成績を入力してください: ");
    scanf("%s %d %f", student.name, &student.age, &student.grade);
    printf("入力された情報: 名前=%s, 年齢=%d, 成績=%.2f\n", student.name, student.age, student.grade);
    return 0;
}

このプログラムでは、ユーザーが名前、年齢、成績を入力すると、それぞれが構造体 Student のメンバーに格納されます。

入力された情報はその後、出力されます。

実行結果

名前、年齢、成績を入力してください: Taro 20 85.5
入力された情報: 名前=Taro, 年齢=20, 成績=85.50

ファイルからの入力

ファイルから複数の変数に対して一度に入力することも可能です。

例えば、ファイルに保存されたデータを読み込む場合、以下のようにします。

#include <stdio.h>
int main() {
    FILE *file;
    int a, b, c;
    file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("ファイルを開くことができません\n");
        return 1;
    }
    fscanf(file, "%d %d %d", &a, &b, &c);
    fclose(file);
    printf("ファイルから読み込んだ値: %d, %d, %d\n", a, b, c);
    return 0;
}

このプログラムでは、ファイル data.txt から3つの整数を読み込み、それぞれが変数 a, b, c に格納されます。

読み込まれた値はその後、出力されます。

実行結果

ファイルから読み込んだ値: 10, 20, 30

(注:この実行結果は、data.txt ファイルに 10 20 30 という内容が書かれていることを前提としています。)

これらの応用例を通じて、複数の変数に対して一度に入力する方法を理解することができました。

これらのテクニックを活用することで、プログラムの効率性と可読性を向上させることができます。

目次から探す