標準入出力

[C++] std::cinで改行を含む複数行入力する方法 – getlineの応用

C++でstd::cinを使用して改行を含む複数行入力を受け取る場合、std::getlineを活用します。

std::getlineは1行ずつ入力を受け取り、改行文字までを文字列として取得します。

複数行を処理するには、ループを用いてstd::getlineを繰り返し呼び出します。

std::cinstd::getlineを併用する際、入力バッファに残る改行文字が干渉する場合があるため、std::cin.ignore()を適切に挿入してバッファをクリアする必要があります。

std::getlineを使った複数行入力の実現方法

C++では、標準入力から複数行のデータを受け取る際に、std::getlineを使用することが一般的です。

std::getlineは、改行を含む文字列を一行ずつ読み込むことができるため、複数行の入力を簡単に処理できます。

以下に、std::getlineを使った複数行入力の基本的な方法を示します。

#include <iostream>
#include <string>
int main() {
    std::string inputLine; // 入力行を格納する変数
    std::cout << "複数行の入力をしてください(終了するには空行を入力):\n";
    // 空行が入力されるまで繰り返し入力を受け付ける
    while (true) {
        std::getline(std::cin, inputLine); // 行を読み込む
        // 空行が入力された場合、ループを終了
        if (inputLine.empty()) {
            break;
        }
        // 入力された行を表示
        std::cout << "入力された行: " << inputLine << std::endl;
    }
    return 0;
}
複数行の入力をしてください(終了するには空行を入力):
こんにちは
入力された行: こんにちは
C++プログラミング
入力された行: C++プログラミング

このコードでは、ユーザーが複数行の入力を行うことができ、空行が入力されるまでその内容を表示します。

std::getlineを使用することで、改行を含む文字列を簡単に取得できるため、複数行の入力処理がスムーズに行えます。

std::cinとstd::getlineの併用時の注意点

C++では、std::cinstd::getlineを併用することができますが、これにはいくつかの注意点があります。

特に、std::cinでの入力後にstd::getlineを使用する場合、意図しない動作が発生することがあります。

以下に、併用時の注意点を解説します。

注意点

注意点説明
バッファの残りstd::cinで数値や文字を読み込んだ後、改行文字がバッファに残ることがある。
空行の読み込みstd::getlineを使用すると、残った改行文字を読み込んでしまい、空行が返される。
入力形式の不一致std::cinstd::getlineで異なる入力形式を扱う場合、注意が必要。

以下のコードは、std::cinで整数を読み込んだ後にstd::getlineを使用して文字列を読み込む例です。

#include <iostream>
#include <string>
int main() {
    int number; // 整数を格納する変数
    std::string inputLine; // 入力行を格納する変数
    std::cout << "整数を入力してください: ";
    std::cin >> number; // 整数を入力
    // std::cinのバッファに残った改行を消費する
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cout << "文字列を入力してください: ";
    std::getline(std::cin, inputLine); // 行を読み込む
    std::cout << "入力された整数: " << number << std::endl;
    std::cout << "入力された文字列: " << inputLine << std::endl;
    return 0;
}
整数を入力してください: 42
文字列を入力してください: こんにちは
入力された整数: 42
入力された文字列: こんにちは

このコードでは、std::cinで整数を読み込んだ後、std::cin.ignore()を使用してバッファに残った改行文字を消費しています。

これにより、std::getlineが正しく動作し、期待通りの入力を得ることができます。

std::cinstd::getlineを併用する際は、バッファの状態に注意を払いましょう。

応用例:複数行入力を効率的に処理する

複数行の入力を効率的に処理するためには、std::getlineを使用して各行を読み込み、必要に応じてデータを格納したり、特定の条件で処理を行ったりすることが重要です。

以下に、複数行の入力を受け取り、特定のキーワードを含む行だけを抽出して表示する例を示します。

#include <iostream>
#include <string>
#include <vector>
int main() {
    std::string inputLine; // 入力行を格納する変数
    std::vector<std::string> filteredLines; // フィルタリングされた行を格納するベクター
    const std::string keyword = "C++"; // 検索するキーワード
    std::cout << "複数行の入力をしてください(終了するには空行を入力):\n";
    // 空行が入力されるまで繰り返し入力を受け付ける
    while (true) {
        std::getline(std::cin, inputLine); // 行を読み込む
        // 空行が入力された場合、ループを終了
        if (inputLine.empty()) {
            break;
        }
        // キーワードが含まれている場合、ベクターに追加
        if (inputLine.find(keyword) != std::string::npos) {
            filteredLines.push_back(inputLine); // 行を追加
        }
    }
    // フィルタリングされた行を表示
    std::cout << "キーワード '" << keyword << "' を含む行:\n";
    for (const auto& line : filteredLines) {
        std::cout << line << std::endl; // 各行を表示
    }
    return 0;
}
複数行の入力をしてください(終了するには空行を入力):
C++は楽しい
Pythonも良い
C++プログラミング
Javaも人気
C++は多用途
(空行を入力)
キーワード 'C++' を含む行:
C++は楽しい
C++プログラミング
C++は多用途

このコードでは、ユーザーから複数行の入力を受け取り、各行に指定したキーワード(この場合は C++ )が含まれているかをチェックしています。

キーワードが見つかった行は、std::vectorに格納され、最後にその内容が表示されます。

このように、std::getlineを活用することで、複数行の入力を効率的に処理し、特定の条件に基づいてデータをフィルタリングすることが可能です。

まとめ

この記事では、C++におけるstd::getlineを使用した複数行入力の方法や、std::cinとの併用時の注意点、さらに複数行入力を効率的に処理する応用例について解説しました。

これらの知識を活用することで、ユーザーからの入力をより柔軟に扱うことが可能になりますので、ぜひ実際のプログラムに取り入れてみてください。

新たな機能を実装する際には、これらのテクニックを参考にして、より使いやすいアプリケーションを作成してみましょう。

関連記事

Back to top button