C++プログラミングにおいて、入力を受け取るcinは非常に重要な役割を担っています。
しかし、初心者にとってはcinの使い方がわかりづらく、エラーが発生してしまうこともあります。
そこで本記事では、cinの基本的な使い方から応用的な使い方まで詳しく解説します。
cinとは何か
C++において、cinは標準入力ストリームを表します。つまり、ユーザーからのキーボード入力をプログラムで受け取るために使用されます。
cinは、iostreamライブラリに含まれています。以下のように、cinを使用する前にプログラムの先頭でiostreamヘッダーファイルをインクルードする必要があります。
#include <iostream>
cinは、次のような形式で使用されます。
std::cin >> 変数名
ここで、変数名はキーボードから入力された値を格納する変数です。例えば、整数型の変数numにキーボードから入力された値を格納する場合は以下のようになります。
int num;
std::cin >> num;
このコードでは、ユーザーがキーボードから入力した値がnum変数に格納されます。
cinの基本的な使い方
C++において、標準入力から値を受け取るためには、cin
という標準入力ストリームを使用します。ここでは、cin
の基本的な使い方について説明します。
変数への入力
まずは、変数への単一の値の入力方法です。以下は、整数型変数num
に対して標準入力から値を受け取り、その値を出力するプログラム例です。
#include <iostream>
int main() {
int num;
std::cout << "整数を入力してください: ";
std::cin >> num;
std::cout << "入力された値は" << num << "です。\n";
return 0;
}
上記プログラムでは、まず整数型変数num
を宣言し、その後に「整数を入力してください: 」というメッセージを表示します。そして、std::cin >> num;
で標準入力から値を受け取ります。
最後に、「入力された値は〇〇です。」というメッセージと共に、受け取った値を出力します。
C言語で使ってきたscanf関数と違い、入力した値を格納する変数のアドレスではなく、変数をそのまま渡さないといけないので気をつけてください(&num
とは書かない)
複数の変数への入力
次に複数の変数への入力方法です。以下は、整数型変数a
, b
, c
に対して標準入力からそれぞれ値を受け取り、その和を出力するプログラム例です。
#include <iostream>
int main() {
int a, b, c;
std::cout << "3つの整数を空白区切りで入力してください: ";
std::cin >> a >> b >> c;
int sum = a + b + c;
std::cout << "3つの整数の和は" << sum << "です。\n";
return 0;
}
上記プログラムでは、まず整数型変数a
, b
, c
を宣言し、「3つの整数を空白区切りで入力してください: 」というメッセージを表示します。
そして、std::cin >> a >> b >> c;
で標準入力からそれぞれ値を受け取ります。最後に、「3つの整数の和は〇〇です。」というメッセージと共に、それらの和を出力します。
改行を無視する方法
デフォルトでは、改行文字も含めて全てが読み込まれますが、「改行文字以外」だけ読み込む方法もあります。以下はその例です。
#include <iostream>
#include <limits>
int main() {
int num1, num2;
// 最初に改行文字列が残ってしまうためクリアする
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// 数字以外が入力されるまで繰り返す
while (true) {
std::cout << "2つの数字(スペース区切り):";
if (std::cin >> num1 >> num2) break;
// 入出エラーが起きた場合(数字以外が来た場合)
std::cerr << "不正な文字列が含まれています\n";
// エラー内容クリア
std::cin.clear();
// 残ったバッファクリア(改行文字列等)
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
// 入出エラー処理終了後、num1,num2 を使って何か処理する...
return 0;
}
上記プログラムでは、2つの数字(スペース区切り):
と表示した後、ユーザーから2つの数字以外が含まれる文字列が来る限り繰り返し要求します。
この時、数字以外が来た場合、エラーメッセージ不正な文字列が含まれています
と表示されます。
また、繰り返しcinで入力を行う場合、エラー内容クリアや残ったバッファクリアも必要な場合があることに注意してください。
入力エラー処理
最後に、ユーザーから予期しない形式や範囲外など不正なデータが送信された場合でも安全かつ適切な動作するよう対策する方法です。 以下はその例です。
#include <iostream>
#include <limits>
int main() {
int age;
while (true) {
std::cout << "年齢:";
//ageへの格納成功(数字が入力された)かつ0以上120以下でなければやり直し
if (std::cin >> age && age >= 0 && age <= 120) break;
// 入出エラー処理(数字以外や範囲外)
if (std::cin.fail()) {
std::cerr << "不正な文字列が含まれています\n";
// エラー内容クリア
std::cin.clear();
} else {
std::cerr << "範囲外または負荷年齢\n";
}
// 残ったバッファクリア(改行文字列等)
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
// 入出エラー処理終了後、age を使って何か処理する...
return 0;
}
上記プログラムでは、「年齢:」と表示した後、ユーザーから正しい数字(0以上120以下)が入力されるまで、入力を要求します。
この時、不正なデータ送信時は適切なエラーメッセージ「不正な文字列/範囲外または負荷年齢」と表示されます。 また、エラー内容クリアや残ったバッファクリアも必要な場合があることに注意してください。