[C言語] キーボードから文字や数字を入力する方法

C言語でキーボードから文字や数字を入力するには、主に標準入力関数を使用します。

文字の入力には、scanf関数やgetchar関数が一般的です。scanfはフォーマット指定子を用いて入力を受け取ることができ、getcharは一文字ずつ入力を受け取ります。

数字の入力もscanfを使用し、整数なら%d、浮動小数点数なら%fを指定します。

これらの関数を使うことで、ユーザーからの入力をプログラム内で処理することが可能です。

この記事でわかること
  • getcharやscanfを使用した文字や数字の入力方法
  • fgets関数を用いた安全な文字列入力
  • 複数のデータ型を同時に入力する方法
  • 入力データの検証とフォーマットの方法
  • 入力バッファのクリア方法とその重要性

目次から探す

キーボード入力の基本

C言語におけるキーボード入力は、プログラムがユーザーからデータを受け取るための基本的な方法です。

ユーザーが入力したデータをプログラム内で処理することで、動的な動作を実現できます。

C言語では、文字や数字、文字列などの異なるデータ型を入力するために、さまざまな関数が用意されています。

これらの関数を適切に使用することで、ユーザーからの入力を効率的に処理し、プログラムの柔軟性を高めることが可能です。

本記事では、C言語でのキーボード入力の基本的な方法と、それに関連する関数の使い方について詳しく解説します。

文字の入力

C言語で文字を入力する際には、主にgetchar関数を使用します。

この関数は、標準入力から1文字を読み取るための基本的な方法です。

ここでは、getchar関数の使い方と、文字入力の具体例、さらに複数文字を入力する際のバッファの扱いについて解説します。

getchar関数の使い方

getchar関数は、標準入力から1文字を読み取り、その文字のASCII値を返します。

入力された文字は、エンターキーが押されるまでバッファに蓄えられ、getchar関数が呼び出されると、バッファから1文字ずつ取り出されます。

以下にgetchar関数の基本的な使い方を示します。

#include <stdio.h>
int main() {
    char ch;
    printf("1文字を入力してください: ");
    ch = getchar(); // 1文字を読み取る
    printf("入力された文字は: %c\n", ch);
    return 0;
}
1文字を入力してください: A
入力された文字は: A

このプログラムでは、ユーザーが入力した1文字をgetchar関数で読み取り、その文字を画面に表示します。

文字入力の例

getchar関数を使った文字入力の例をもう一つ示します。

ここでは、入力された文字がアルファベットの大文字か小文字かを判定します。

#include <stdio.h>
int main() {
    char ch;
    printf("1文字を入力してください: ");
    ch = getchar();
    
    if (ch >= 'A' && ch <= 'Z') {
        printf("入力された文字は大文字です。\n");
    } else if (ch >= 'a' && ch <= 'z') {
        printf("入力された文字は小文字です。\n");
    } else {
        printf("入力された文字はアルファベットではありません。\n");
    }
    return 0;
}
1文字を入力してください: b
入力された文字は小文字です。

このプログラムは、入力された文字が大文字か小文字かを判定し、結果を表示します。

複数文字の入力とバッファ

getchar関数は1文字ずつしか読み取れないため、複数文字を入力する場合にはループを使用します。

また、入力バッファにはエンターキーの入力も含まれるため、これを適切に処理する必要があります。

#include <stdio.h>
int main() {
    char ch;
    printf("文字列を入力してください(Enterで終了): ");
    
    while ((ch = getchar()) != '\n') { // 改行が入力されるまでループ
        printf("入力された文字: %c\n", ch);
    }
    
    return 0;
}
文字列を入力してください(Enterで終了): Hello
入力された文字: H
入力された文字: e
入力された文字: l
入力された文字: l
入力された文字: o

このプログラムでは、ユーザーがエンターキーを押すまで入力された文字を1文字ずつ表示します。

getchar関数を使うことで、入力バッファから1文字ずつ取り出し、処理することができます。

数字の入力

C言語で数字を入力する際には、scanf関数を使用します。

この関数は、標準入力から指定された形式でデータを読み取るための便利な方法です。

ここでは、scanf関数の使い方と、数字入力の具体例、さらに入力エラーの処理について解説します。

scanf関数の使い方

scanf関数は、フォーマット指定子を使用して、入力されたデータを特定の型に変換し、変数に格納します。

数字を入力する場合、整数には%d、浮動小数点数には%fを使用します。

以下にscanf関数の基本的な使い方を示します。

#include <stdio.h>
int main() {
    int number;
    printf("整数を入力してください: ");
    scanf("%d", &number); // 整数を読み取る
    printf("入力された整数は: %d\n", number);
    return 0;
}
整数を入力してください: 42
入力された整数は: 42

このプログラムでは、ユーザーが入力した整数をscanf関数で読み取り、その値を画面に表示します。

数字入力の例

scanf関数を使った数字入力の例をもう一つ示します。

ここでは、ユーザーから2つの浮動小数点数を入力し、その和を計算します。

#include <stdio.h>
int main() {
    float num1, num2, sum;
    printf("2つの浮動小数点数を入力してください(スペースで区切る): ");
    scanf("%f %f", &num1, &num2); // 2つの浮動小数点数を読み取る
    
    sum = num1 + num2;
    printf("入力された数の和は: %.2f\n", sum);
    return 0;
}
2つの浮動小数点数を入力してください(スペースで区切る): 3.5 4.2
入力された数の和は: 7.70

このプログラムは、ユーザーが入力した2つの浮動小数点数の和を計算し、結果を表示します。

入力エラーの処理

scanf関数を使用する際には、入力エラーを適切に処理することが重要です。

入力が期待される形式と異なる場合、scanfは入力を正しく読み取れず、エラーが発生します。

以下に入力エラーの処理方法を示します。

#include <stdio.h>
int main() {
    int number;
    printf("整数を入力してください: ");
    
    if (scanf("%d", &number) != 1) { // 入力が整数でない場合
        printf("入力エラー: 整数を入力してください。\n");
        // 入力バッファをクリア
        while (getchar() != '\n');
    } else {
        printf("入力された整数は: %d\n", number);
    }
    
    return 0;
}
整数を入力してください: abc
入力エラー: 整数を入力してください。

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

また、入力バッファをクリアすることで、次の入力を正しく処理できるようにしています。

文字列の入力

C言語で文字列を入力する際には、gets関数fgets関数を使用します。

しかし、gets関数はバッファオーバーフローの危険性があるため、fgets関数の使用が推奨されています。

ここでは、gets関数fgets関数の違い、fgets関数の使い方、そして文字列入力の具体例について解説します。

gets関数とfgets関数の違い

スクロールできます
関数名特徴注意点
gets標準入力から改行までの文字列を読み取るバッファオーバーフローの危険性があるため、
使用は推奨されない
fgets標準入力から指定した長さまでの文字列を読み取るバッファサイズを指定するため、
安全に使用できる

gets関数は、入力された文字列を改行まで読み取りますが、バッファサイズを指定しないため、入力が長すぎるとバッファオーバーフローが発生する可能性があります。

一方、fgets関数は、バッファサイズを指定することで、バッファオーバーフローを防ぎ、安全に文字列を読み取ることができます。

fgets関数の使い方

fgets関数は、指定したバッファに対して、最大で指定した長さまでの文字列を読み取ります。

改行文字も含めて読み取るため、文字列の末尾に改行が含まれることがあります。

以下にfgets関数の基本的な使い方を示します。

#include <stdio.h>
int main() {
    char buffer[100];
    printf("文字列を入力してください: ");
    fgets(buffer, sizeof(buffer), stdin); // 文字列を読み取る
    printf("入力された文字列は: %s", buffer);
    return 0;
}
文字列を入力してください: Hello, World!
入力された文字列は: Hello, World!

このプログラムでは、ユーザーが入力した文字列をfgets関数で読み取り、その文字列を画面に表示します。

文字列入力の例

fgets関数を使った文字列入力の例をもう一つ示します。

ここでは、入力された文字列の長さを計算し、表示します。

#include <stdio.h>
#include <string.h>
int main() {
    char buffer[100];
    printf("文字列を入力してください: ");
    fgets(buffer, sizeof(buffer), stdin);
    
    // 末尾の改行を削除
    buffer[strcspn(buffer, "\n")] = '
#include <stdio.h>
#include <string.h>
int main() {
    char buffer[100];
    printf("文字列を入力してください: ");
    fgets(buffer, sizeof(buffer), stdin);
    
    // 末尾の改行を削除
    buffer[strcspn(buffer, "\n")] = '\0';
    
    printf("入力された文字列の長さは: %zu\n", strlen(buffer));
    return 0;
}
'; printf("入力された文字列の長さは: %zu\n", strlen(buffer)); return 0; }
文字列を入力してください: C programming
入力された文字列の長さは: 13

このプログラムは、fgets関数で入力された文字列の長さを計算し、結果を表示します。

strcspn関数を使用して、文字列の末尾に含まれる改行を削除することで、正確な文字列の長さを取得しています。

応用例

C言語でのキーボード入力は、基本的な文字や数字の入力だけでなく、さまざまな応用が可能です。

ここでは、複数のデータ型の入力、入力データの検証、入力データのフォーマットについて解説します。

複数のデータ型の入力

C言語では、scanf関数を使用して、複数の異なるデータ型を一度に入力することができます。

以下に、整数と浮動小数点数を同時に入力する例を示します。

#include <stdio.h>
int main() {
    int age;
    float height;
    printf("年齢と身長を入力してください(スペースで区切る): ");
    scanf("%d %f", &age, &height); // 整数と浮動小数点数を読み取る
    printf("入力された年齢は: %d\n", age);
    printf("入力された身長は: %.2f\n", height);
    return 0;
}
年齢と身長を入力してください(スペースで区切る): 25 175.5
入力された年齢は: 25
入力された身長は: 175.50

このプログラムでは、ユーザーが入力した年齢と身長をそれぞれ整数と浮動小数点数として読み取り、表示します。

入力データの検証

入力データの検証は、ユーザーが正しい形式でデータを入力したかどうかを確認するために重要です。

以下に、整数の入力を検証する例を示します。

#include <stdio.h>
int main() {
    int number;
    printf("整数を入力してください: ");
    
    while (scanf("%d", &number) != 1) { // 入力が整数でない場合
        printf("入力エラー: 整数を入力してください。\n");
        // 入力バッファをクリア
        while (getchar() != '\n');
        printf("再度、整数を入力してください: ");
    }
    
    printf("入力された整数は: %d\n", number);
    return 0;
}
整数を入力してください: abc
入力エラー: 整数を入力してください。
再度、整数を入力してください: 42
入力された整数は: 42

このプログラムは、ユーザーが整数を入力するまで繰り返し入力を求め、正しい形式で入力された場合にのみ処理を進めます。

入力データのフォーマット

入力データのフォーマットは、ユーザーが入力したデータを特定の形式で表示するために使用されます。

以下に、日付を入力し、特定のフォーマットで表示する例を示します。

#include <stdio.h>
int main() {
    int year, month, day;
    printf("日付を入力してください(年 月 日の順でスペースで区切る): ");
    scanf("%d %d %d", &year, &month, &day);
    printf("入力された日付は: %04d/%02d/%02d\n", year, month, day);
    return 0;
}
日付を入力してください(年 月 日の順でスペースで区切る): 2023 10 5
入力された日付は: 2023/10/05

このプログラムでは、ユーザーが入力した日付をYYYY/MM/DDの形式で表示します。

フォーマット指定子を使用することで、ゼロパディングを行い、見やすい形式でデータを表示することができます。

よくある質問

scanfでの入力がうまくいかないのはなぜ?

scanf関数での入力がうまくいかない原因として、入力形式が期待されるフォーマットと異なることが考えられます。

例えば、整数を期待しているのに文字列を入力した場合、scanfは入力を正しく処理できません。

また、入力バッファに残った改行やスペースが次の入力に影響を与えることもあります。

入力が失敗した場合は、scanfの戻り値を確認し、入力バッファをクリアすることで問題を解決できます。

複数の文字を入力する際の注意点は?

複数の文字を入力する際には、入力バッファに注意が必要です。

getcharfgetsを使用する場合、改行文字もバッファに含まれるため、次の入力に影響を与えることがあります。

特に、scanfgetcharを組み合わせて使用する場合、scanfの後にgetcharを呼び出して改行を消費することで、バッファの影響を防ぐことができます。

入力バッファをクリアする方法は?

入力バッファをクリアするには、getcharを使用してバッファ内の文字を消費する方法があります。

例えば、while (getchar() != '\n');のようにループを使用して、改行文字が現れるまでバッファを読み続けることで、バッファをクリアできます。

この方法は、scanfでの入力エラー後にバッファをクリアする際に特に有効です。

まとめ

C言語でのキーボード入力は、プログラムに柔軟性を持たせるための重要な技術です。

この記事では、文字や数字、文字列の入力方法と、それに関連する関数の使い方、応用例について学びました。

これらの知識を活用して、よりインタラクティブなプログラムを作成してみましょう。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 初学者向け (30)
  • URLをコピーしました!
目次から探す