標準入出力

[C++] std::getlineでcinを使って1行入力を実装する方法

C++でstd::getlineを使用してstd::cinから1行入力を取得するには、std::getline(std::cin,変数)を用います。

この関数は改行文字までの入力を文字列として取得します。

std::cinで数値入力を行った後にstd::getlineを使う場合、入力バッファに残った改行文字が影響するため、std::cin.ignore()でバッファをクリアする必要があります。

std::getlineを使った基本的な1行入力の実装

C++では、標準入力から1行を読み取るためにstd::getlineを使用します。

この関数は、入力ストリームから改行文字が現れるまでの文字列を取得し、改行文字は読み取られません。

以下に、std::getlineを使った基本的な1行入力の実装例を示します。

#include <iostream>
#include <string>
int main() {
    std::string input; // 入力を格納するための変数
    std::cout << "1行のテキストを入力してください: "; // ユーザーへのメッセージ
    std::getline(std::cin, input); // 標準入力から1行を読み取る
    std::cout << "入力されたテキスト: " << input << std::endl; // 入力内容を表示
    return 0; // プログラムの終了
}

このコードを実行すると、ユーザーは1行のテキストを入力するように促されます。

入力が完了すると、その内容が表示されます。

1行のテキストを入力してください: Hello, World!
入力されたテキスト: Hello, World!

このように、std::getlineを使用することで、簡単に1行の入力を取得することができます。

std::cinとstd::getlineの組み合わせで注意すべき点

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 text; // 文字列を格納する変数
    std::cout << "数値を入力してください: "; // ユーザーへのメッセージ
    std::cin >> number; // 数値を入力
    std::cin.ignore(); // バッファに残る改行文字を無視
    std::cout << "1行のテキストを入力してください: "; // ユーザーへのメッセージ
    std::getline(std::cin, text); // 標準入力から1行を読み取る
    std::cout << "入力された数値: " << number << std::endl; // 数値を表示
    std::cout << "入力されたテキスト: " << text << std::endl; // 文字列を表示
    return 0; // プログラムの終了
}

このコードでは、std::cin.ignore()を使用して、std::cinでの入力後に残った改行文字を無視しています。

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

数値を入力してください: 42
1行のテキストを入力してください: Hello, World!
入力された数値: 42
入力されたテキスト: Hello, World!

このように、std::cinstd::getlineを組み合わせる際は、バッファの状態に注意し、必要に応じてstd::cin.ignore()を使用することが重要です。

応用的な使い方

std::getlineは、基本的な1行入力だけでなく、さまざまな応用が可能です。

ここでは、いくつかの応用的な使い方を紹介します。

1. 複数行の入力を取得する

std::getlineをループ内で使用することで、複数行の入力を取得することができます。

以下のコードは、ユーザーが exit と入力するまで、複数行のテキストを読み取る例です。

#include <iostream>
#include <string>
int main() {
    std::string line; // 各行を格納する変数
    std::cout << "テキストを入力してください(終了するには 'exit' と入力):" << std::endl;
    while (true) {
        std::getline(std::cin, line); // 1行を読み取る
        if (line == "exit") { // 終了条件
            break; // ループを抜ける
        }
        std::cout << "入力された行: " << line << std::endl; // 入力内容を表示
    }
    return 0; // プログラムの終了
}

このコードを実行すると、ユーザーは複数行のテキストを入力でき、”exit”と入力することで終了します。

テキストを入力してください(終了するには 'exit' と入力):
Hello
入力された行: Hello
World
入力された行: World
exit

2. 特定の区切り文字で分割する

std::getlineを使用して、特定の区切り文字で文字列を分割することも可能です。

以下の例では、カンマで区切られた値を読み取り、分割して表示します。

#include <iostream>
#include <string>
#include <sstream> // std::stringstreamを使用するために必要
int main() {
    std::string input; // 入力を格納する変数
    std::cout << "カンマ区切りの値を入力してください: "; // ユーザーへのメッセージ
    std::getline(std::cin, input); // 1行を読み取る
    std::stringstream ss(input); // 文字列ストリームを作成
    std::string value; // 各値を格納する変数
    while (std::getline(ss, value, ',')) { // カンマで分割
        std::cout << "分割された値: " << value << std::endl; // 各値を表示
    }
    return 0; // プログラムの終了
}

このコードでは、カンマで区切られた入力を受け取り、それぞれの値を分割して表示します。

カンマ区切りの値を入力してください: Apple,Banana,Cherry
分割された値: Apple
分割された値: Banana
分割された値: Cherry

3. 入力のトリミング

std::getlineで取得した文字列の前後にある空白をトリミングすることもできます。

以下の例では、入力された文字列の前後の空白を削除して表示します。

#include <iostream>
#include <string>
#include <algorithm> // std::remove_ifを使用するために必要
// 空白をトリミングする関数
std::string trim(const std::string& str) {
    auto start = str.begin();
    while (start != str.end() && std::isspace(*start)) {
        ++start; // 前の空白をスキップ
    }
    auto end = str.end();
    do {
        --end; // 後ろの空白をスキップ
    } while (end != start && std::isspace(*end));
    return std::string(start, end + 1); // トリミングした文字列を返す
}
int main() {
    std::string input; // 入力を格納する変数
    std::cout << "テキストを入力してください(前後の空白がトリミングされます): ";
    std::getline(std::cin, input); // 1行を読み取る
    std::string trimmedInput = trim(input); // 空白をトリミング
    std::cout << "トリミングされたテキスト: '" << trimmedInput << "'" << std::endl; // 結果を表示
    return 0; // プログラムの終了
}

このコードでは、入力された文字列の前後の空白を削除し、トリミングされた結果を表示します。

テキストを入力してください(前後の空白がトリミングされます):   Hello, World!  
トリミングされたテキスト: 'Hello, World!'

これらの応用的な使い方を通じて、std::getlineの柔軟性と便利さを活用することができます。

まとめ

この記事では、C++のstd::getlineを使用した1行入力の基本的な実装方法から、std::cinとの組み合わせで注意すべき点、さらには応用的な使い方まで幅広く解説しました。

これにより、ユーザーは入力処理におけるさまざまなテクニックを活用できるようになります。

今後は、実際のプログラムにこれらの技術を取り入れ、より効率的な入力処理を実現してみてください。

関連記事

Back to top button