[C言語] scanfで入力した値を配列に格納する方法

C言語でユーザーからの入力を配列に格納するには、scanf関数を使用します。

まず、配列を宣言し、scanfを用いてユーザーからの入力を受け取ります。

例えば、整数の配列に値を格納する場合、scanf("%d", &array[i])のように、配列の各要素に対して入力を受け付けます。

この方法を用いることで、ユーザーからの複数の入力を効率的に配列に格納することが可能です。

この記事でわかること
  • scanfを用いた配列への整数、浮動小数点数、文字列の入力方法
  • 入力エラーの検出とバッファオーバーフローの防止策
  • 2次元配列や動的配列への入力方法
  • ファイルからの入力を配列に格納する方法
  • 入力値のソート、検索、統計処理の実践方法

目次から探す

scanfを用いた配列への入力

C言語でユーザーからの入力を受け取る際に、scanf関数は非常に便利です。

特に、配列に対して入力を行う場合、scanfを適切に使用することで効率的にデータを格納できます。

ここでは、整数、浮動小数点数、文字列の入力方法と、複数の値を一度に入力する方法について解説します。

配列に整数を入力する方法

整数を配列に入力するには、scanfをループ内で使用します。

以下にサンプルコードを示します。

#include <stdio.h>
int main() {
    int numbers[5]; // 整数を格納する配列
    printf("5つの整数を入力してください:\n");
    
    for (int i = 0; i < 5; i++) {
        printf("%d番目の整数: ", i + 1);
        scanf("%d", &numbers[i]); // 配列の各要素に整数を入力
    }
    
    printf("入力された整数は次の通りです:\n");
    for (int i = 0; i < 5; i++) {
        printf("%d ", numbers[i]);
    }
    return 0;
}
5つの整数を入力してください:
1番目の整数: 10
2番目の整数: 20
3番目の整数: 30
4番目の整数: 40
5番目の整数: 50
入力された整数は次の通りです:
10 20 30 40 50

このプログラムでは、5つの整数をユーザーから入力し、それを配列に格納しています。

scanfを使って、各配列要素に入力された値を代入しています。

配列に浮動小数点数を入力する方法

浮動小数点数を配列に入力する場合も、整数と同様にscanfを使用します。

以下に例を示します。

#include <stdio.h>
int main() {
    float numbers[5]; // 浮動小数点数を格納する配列
    printf("5つの浮動小数点数を入力してください:\n");
    
    for (int i = 0; i < 5; i++) {
        printf("%d番目の数: ", i + 1);
        scanf("%f", &numbers[i]); // 配列の各要素に浮動小数点数を入力
    }
    
    printf("入力された数は次の通りです:\n");
    for (int i = 0; i < 5; i++) {
        printf("%.2f ", numbers[i]);
    }
    return 0;
}
5つの浮動小数点数を入力してください:
1番目の数: 1.1
2番目の数: 2.2
3番目の数: 3.3
4番目の数: 4.4
5番目の数: 5.5
入力された数は次の通りです:
1.10 2.20 3.30 4.40 5.50

このプログラムでは、5つの浮動小数点数を入力し、それを配列に格納しています。

%fを使用して浮動小数点数を読み取ります。

配列に文字列を入力する方法

文字列を配列に入力する場合、scanfを使う際に注意が必要です。

以下に例を示します。

#include <stdio.h>
int main() {
    char words[5][20]; // 文字列を格納する2次元配列
    printf("5つの単語を入力してください:\n");
    
    for (int i = 0; i < 5; i++) {
        printf("%d番目の単語: ", i + 1);
        scanf("%19s", words[i]); // 各単語を配列に入力
    }
    
    printf("入力された単語は次の通りです:\n");
    for (int i = 0; i < 5; i++) {
        printf("%s ", words[i]);
    }
    return 0;
}
5つの単語を入力してください:
1番目の単語: apple
2番目の単語: banana
3番目の単語: cherry
4番目の単語: date
5番目の単語: elderberry
入力された単語は次の通りです:
apple banana cherry date elderberry

このプログラムでは、5つの単語を入力し、それを2次元配列に格納しています。

%19sを使用して、各単語の最大長を19文字に制限しています。

複数の値を一度に入力する方法

scanfを使って複数の値を一度に入力することも可能です。

以下に例を示します。

#include <stdio.h>
int main() {
    int a, b, c;
    printf("3つの整数をスペースで区切って入力してください:\n");
    scanf("%d %d %d", &a, &b, &c); // 複数の整数を一度に入力
    
    printf("入力された整数は次の通りです: %d, %d, %d\n", a, b, c);
    return 0;
}
3つの整数をスペースで区切って入力してください:
10 20 30
入力された整数は次の通りです: 10, 20, 30

このプログラムでは、3つの整数を一度に入力し、それぞれの変数に格納しています。

scanfのフォーマット指定子を連続して使用することで、複数の値を一度に読み取ることができます。

エラーチェックとデバッグ

C言語でプログラムを作成する際、入力エラーやバッファオーバーフローなどの問題を未然に防ぐことが重要です。

これにより、プログラムの信頼性と安全性を向上させることができます。

ここでは、入力エラーの検出方法、バッファオーバーフローの防止策、そしてデバッグのためのヒントについて解説します。

入力エラーの検出

scanfを使用する際、ユーザーが予期しない入力を行うことがあります。

これを検出するために、scanfの戻り値を確認することが有効です。

#include <stdio.h>
int main() {
    int number;
    printf("整数を入力してください: ");
    
    if (scanf("%d", &number) != 1) { // 入力が整数でない場合
        printf("入力エラー: 整数を入力してください。\n");
        return 1; // エラーコードを返す
    }
    
    printf("入力された整数は: %d\n", number);
    return 0;
}

このプログラムでは、scanfの戻り値をチェックし、整数が正しく入力されなかった場合にエラーメッセージを表示します。

scanfは、成功した入力の数を返すため、期待する数と異なる場合はエラーと判断できます。

バッファオーバーフローの防止

バッファオーバーフローは、配列のサイズを超えるデータが入力されることで発生します。

これを防ぐために、scanfのフォーマット指定子で入力サイズを制限することが重要です。

#include <stdio.h>
int main() {
    char buffer[10];
    printf("9文字以内の文字列を入力してください: ");
    
    scanf("%9s", buffer); // 最大9文字まで入力を許可
    printf("入力された文字列は: %s\n", buffer);
    
    return 0;
}

このプログラムでは、%9sを使用して、最大9文字までの入力を許可しています。

これにより、バッファオーバーフローを防ぎ、安全に文字列を扱うことができます。

デバッグのためのヒント

デバッグは、プログラムの問題を特定し、修正するための重要なプロセスです。

以下に、デバッグを効率的に行うためのヒントをいくつか紹介します。

  • printfデバッグ: プログラムの実行中に変数の値を確認するために、printfを使用して出力する方法です。

例:printf("変数xの値: %d\n", x);

  • コメントアウト: 問題のあるコードを一時的に無効にするために、コメントアウトを活用します。

これにより、特定のコードが問題を引き起こしているかどうかを確認できます。

  • 小さな変更をテスト: 大きな変更を一度に行うのではなく、小さな変更を加えてテストを行うことで、問題の特定が容易になります。
  • 一貫したインデント: コードの可読性を向上させるために、一貫したインデントスタイルを維持します。

これにより、コードの構造が明確になり、バグの発見が容易になります。

これらのヒントを活用することで、プログラムのデバッグがより効率的に行えるようになります。

応用例

C言語での配列操作は、基本的な入力から応用的な処理まで幅広く活用できます。

ここでは、2次元配列や動的配列への入力、ファイルからの入力、入力値のソートと検索、統計処理について解説します。

2次元配列への入力

2次元配列は、行列のようなデータを扱う際に便利です。

以下に、2次元配列への入力方法を示します。

#include <stdio.h>
int main() {
    int matrix[3][3]; // 3x3の2次元配列
    printf("3x3の行列を入力してください:\n");
    
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("matrix[%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]); // 各要素に整数を入力
        }
    }
    
    printf("入力された行列は次の通りです:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

このプログラムでは、3×3の行列を入力し、2次元配列に格納しています。

各要素に対してscanfを使用して入力を受け取ります。

動的配列への入力

動的配列は、実行時にサイズを決定できるため、柔軟なメモリ管理が可能です。

以下に、動的配列への入力方法を示します。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int n;
    printf("配列のサイズを入力してください: ");
    scanf("%d", &n);
    
    int *array = (int *)malloc(n * sizeof(int)); // 動的にメモリを確保
    if (array == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    
    printf("%d個の整数を入力してください:\n", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &array[i]);
    }
    
    printf("入力された整数は次の通りです:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    
    free(array); // メモリを解放
    return 0;
}

このプログラムでは、ユーザーが指定したサイズの配列を動的に確保し、入力を受け取っています。

mallocを使用してメモリを確保し、使用後にfreeで解放します。

ファイルからの入力を配列に格納

ファイルからデータを読み取り、配列に格納することも可能です。

以下に例を示します。

#include <stdio.h>
int main() {
    FILE *file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("ファイルを開くことができませんでした。\n");
        return 1;
    }
    
    int numbers[100];
    int i = 0;
    while (fscanf(file, "%d", &numbers[i]) != EOF && i < 100) {
        i++;
    }
    
    fclose(file);
    
    printf("ファイルから読み取った整数は次の通りです:\n");
    for (int j = 0; j < i; j++) {
        printf("%d ", numbers[j]);
    }
    printf("\n");
    
    return 0;
}

このプログラムでは、data.txtというファイルから整数を読み取り、配列に格納しています。

fscanfを使用してファイルからデータを読み取ります。

入力値のソートと検索

配列に格納されたデータをソートし、検索することはよくある操作です。

以下に、バブルソートを用いたソートと線形探索を用いた検索の例を示します。

#include <stdio.h>
void bubbleSort(int array[], int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (array[j] > array[j + 1]) {
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}
int linearSearch(int array[], int size, int key) {
    for (int i = 0; i < size; i++) {
        if (array[i] == key) {
            return i;
        }
    }
    return -1;
}
int main() {
    int numbers[] = {34, 7, 23, 32, 5, 62};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    
    bubbleSort(numbers, size);
    
    printf("ソートされた配列:\n");
    for (int i = 0; i < size; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");
    
    int key = 23;
    int index = linearSearch(numbers, size, key);
    if (index != -1) {
        printf("値 %d はインデックス %d にあります。\n", key, index);
    } else {
        printf("値 %d は配列に存在しません。\n", key);
    }
    
    return 0;
}

このプログラムでは、バブルソートを用いて配列を昇順にソートし、線形探索を用いて特定の値を検索しています。

入力値の統計処理

配列に格納されたデータに対して、平均や最大値、最小値などの統計処理を行うことができます。

以下に例を示します。

#include <stdio.h>
void calculateStatistics(int array[], int size, double *average, int *max, int *min) {
    int sum = 0;
    *max = array[0];
    *min = array[0];
    
    for (int i = 0; i < size; i++) {
        sum += array[i];
        if (array[i] > *max) {
            *max = array[i];
        }
        if (array[i] < *min) {
            *min = array[i];
        }
    }
    
    *average = (double)sum / size;
}
int main() {
    int numbers[] = {10, 20, 30, 40, 50};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    double average;
    int max, min;
    
    calculateStatistics(numbers, size, &average, &max, &min);
    
    printf("平均: %.2f\n", average);
    printf("最大値: %d\n", max);
    printf("最小値: %d\n", min);
    
    return 0;
}

このプログラムでは、配列の平均、最大値、最小値を計算しています。

calculateStatistics関数を使用して、これらの統計情報を取得しています。

よくある質問

scanfで配列のサイズを超える入力を防ぐには?

scanfで配列のサイズを超える入力を防ぐためには、フォーマット指定子で入力サイズを制限することが重要です。

例えば、文字列を入力する際には、%sの前に最大入力サイズを指定します。

例:scanf("%9s", buffer);とすることで、最大9文字までの入力を許可し、バッファオーバーフローを防ぎます。

scanfで入力した値が正しいかどうかを確認する方法は?

scanfで入力した値が正しいかどうかを確認するには、scanfの戻り値をチェックします。

scanfは、成功した入力の数を返すため、期待する数と異なる場合はエラーと判断できます。

例えば、整数を入力する場合、if (scanf("%d", &number) != 1)のようにチェックすることで、入力が整数でない場合にエラーを検出できます。

scanfを使わずに配列に値を入力する方法はある?

scanfを使わずに配列に値を入力する方法として、fgetsを使用することができます。

fgetsは、指定したサイズまでの文字列を入力し、バッファオーバーフローを防ぐことができます。

例:fgets(buffer, sizeof(buffer), stdin);とすることで、標準入力から文字列を安全に読み取ることができます。

まとめ

C言語におけるscanfを用いた配列への入力方法とその応用について理解を深めることができました。

入力エラーの検出やバッファオーバーフローの防止策、デバッグのヒントを活用することで、より安全で効率的なプログラムを作成できます。

この記事を参考に、実際のプログラムでこれらのテクニックを試してみてください。

  • URLをコピーしました!
目次から探す