C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のcinの戻り値を活用して、個数が不定の入力を取得する方法

プログラムを作成していると、ユーザーから受け取る入力の個数が事前に分からないケースによく出会います。この記事では、C++の cin を使って、個数が不定の入力を効率的に読み取る方法を解説します。

基本的な考え方

最も単純なアプローチは、ループを回しながら特定の値(例えば -1 など)が入力されたら終了する方法です。しかし、これには「その値自体は有効な入力として扱えない」という制約が伴います。

そこで便利なのが、cin >> input の戻り値を利用する手法です。cin からの読み込みは、入力が数値として解釈できない場合に失敗するため、その結果を条件式に使えば、数値以外の文字が入力された時点でループを自然に終了させることができます。

サンプルコード

#include <iostream>
using namespace std;

int main() {
    int input;
    int n = 0;
    cout << "Enter numbers. (To stop enter any character): ";
    while (cin >> input)
        n++;
    cout << "\nTotal number of inputs entered: " << n;
    return 0;
}

実行結果

Enter numbers. (To stop enter any character): 
5
6
7
2
6
5
j
Total number of inputs entered: 6

仕組みの解説

while (cin >> input) の動作を詳しく見てみましょう。cin >> input はストリームオブジェクト(istream)への参照を返します。このストリームは bool 型への変換演算子を持っており、直前の読み込み操作が成功したかどうかを表します。

数値の読み込み中に「j」のような文字が現れると、ストリームの失敗ビット(failbit)がセットされ、条件式は false と評価されてループが終了します。C++11 以降ではこの変換は explicit operator bool として定義されているため、if 文や while 文などの条件式の中でのみ有効に機能し、意図しない暗黙の型変換を防ぐようになっています。

注意点

  • この方法では、入力を終えた後のストリームは失敗状態になっているため、同じ cin を再利用する場合は cin.clear() で状態をクリアし、残りの不正な入力を読み捨てる必要があります。
  • ファイルの終端(EOF)に達した場合も同様にループが終了するため、パイプやリダイレクトからの入力処理にも応用できます。
  1. C++で文字列の部分文字列の総数を求める方法を解説

    この記事では、与えられた文字列から作成できる空でない部分文字列の個数を求める方法について解説します。入力 : string = "moon" 出力 : 10 説明 : 部分文字列は m、o、o、n、mo、oo、on、moo、oon、moon の 10 個です。 入力 : string = "yellow" 出力 : 21解法のアプローチ文字列の長さを n とします。上の例からも分かるように、考えられるすべての部分文字列の個数を求めるには、長さ n、(n-1)、(n-2)、(n-3)、……2、1 の部分文字列の個数を順に加算していく必要があります。部分文

  2. C++で列車の停車駅の組み合わせ数を求める方法

    地点XとYの間にはn個の中間駅があるとします。ここで、「どの2つの停車駅も隣り合わない」という条件のもとで、s個の駅に停車する列車の配置方法が何通りあるかを求める問題を考えてみましょう。この記事では、停車駅の組み合わせ数を求めるためのアプローチを段階的に詳しく解説します。この問題は、本質的には組合せ論の問題であり、s個の停車駅の選び方の総数を求めることになります。 問題を解くアプローチ まず具体例として、中間駅が8個あり、そのうち3個の駅に停車させたい場合を考えてみます。 n = 8, s = 3 このとき、列車が停車できない駅は(n − s)、つまり5個残ることになります。 停車できない