標準入出力

[C++] std::cinで文字列の入力を行う方法

C++でstd::cinを使用して文字列を入力する場合、std::string型の変数を用います。

std::cinは空白文字(スペースや改行)で入力を区切るため、単語単位での入力が可能です。

複数単語を含む文字列を取得したい場合は、std::getlineを使用します。

例として、std::cin >> str;は単語を取得し、std::getline(std::cin, str);は改行までの全体を取得します。

std::cinを使った文字列入力の基本

C++において、標準入力から文字列を取得するためには、std::cinを使用します。

std::cinは、標準入力ストリームを表し、ユーザーからの入力を受け取るための便利な方法です。

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

#include <iostream>
#include <string>
int main() {
    std::string input; // 入力を格納するための変数
    std::cout << "文字列を入力してください: "; // ユーザーへのメッセージ
    std::cin >> input; // 標準入力から文字列を取得
    std::cout << "入力された文字列: " << input << std::endl; // 入力された文字列を表示
    return 0;
}
文字列を入力してください: C++プログラミング
入力された文字列: C++プログラミング

このコードでは、ユーザーに文字列の入力を促し、std::cinを使ってその入力をinputという変数に格納しています。

入力された文字列は、std::coutを使って表示されます。

std::cinは、空白で区切られた単語を1つずつ読み取るため、複数の単語を含む文字列を入力する場合には注意が必要です。

複数単語を含む文字列の入力

std::cinを使用して複数の単語を含む文字列を入力する場合、通常のstd::cinでは空白で区切られた最初の単語しか取得できません。

複数の単語を含む文字列を取得するためには、std::getline関数を使用するのが一般的です。

以下にその方法を示します。

#include <iostream>
#include <string>
int main() {
    std::string input; // 入力を格納するための変数
    std::cout << "複数の単語を含む文字列を入力してください: "; // ユーザーへのメッセージ
    std::getline(std::cin, input); // 標準入力から複数単語を含む文字列を取得
    std::cout << "入力された文字列: " << input << std::endl; // 入力された文字列を表示
    return 0;
}
複数の単語を含む文字列を入力してください: C++ プログラミング は楽しい
入力された文字列: C++ プログラミング は楽しい

このコードでは、std::getlineを使用して、ユーザーが入力したすべての文字列を取得しています。

これにより、空白を含む複数の単語を1つの文字列として扱うことができます。

std::getlineは、改行が入力されるまでのすべての文字を読み取るため、ユーザーが入力した内容をそのまま保持することができます。

std::cinの入力エラーとその対処法

std::cinを使用する際には、ユーザーの入力に対してエラーが発生することがあります。

特に、期待されるデータ型と異なる入力が行われた場合、入力ストリームがエラー状態に陥ります。

このセクションでは、std::cinの入力エラーとその対処法について説明します。

入力エラーの種類

エラーの種類説明
型の不一致期待されるデータ型と異なる入力が行われた場合
EOFエラー入力の終わり(End Of File)が発生した場合
フラグの設定エラーが発生すると、std::cinのフラグが設定される

エラー処理の方法

以下のサンプルコードでは、std::cinの入力エラーを検出し、適切に対処する方法を示します。

#include <iostream>
#include <limits> // std::numeric_limitsを使用するために必要
int main() {
    int number; // 整数を格納するための変数
    std::cout << "整数を入力してください: "; // ユーザーへのメッセージ
    while (true) {
        std::cin >> number; // 標準入力から整数を取得
        // 入力エラーが発生した場合
        if (std::cin.fail()) {
            std::cin.clear(); // エラーフラグをクリア
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 不正な入力を無視
            std::cout << "無効な入力です。再度整数を入力してください: "; // エラーメッセージ
        } else {
            break; // 正常な入力があればループを抜ける
        }
    }
    std::cout << "入力された整数: " << number << std::endl; // 入力された整数を表示
    return 0;
}
整数を入力してください: abc
無効な入力です。再度整数を入力してください: 123
入力された整数: 123

このコードでは、ユーザーが整数を入力することを期待していますが、無効な入力(例えば文字列)が行われた場合、std::cin.fail()を使ってエラーを検出します。

エラーが発生した場合は、std::cin.clear()でエラーフラグをクリアし、std::cin.ignore()で不正な入力を無視します。

これにより、プログラムは再度入力を促すことができます。

応用的な文字列入力のテクニック

C++における文字列入力には、基本的な方法に加えて、さまざまな応用的なテクニックがあります。

ここでは、特定の条件に基づいた入力の取得や、入力内容の加工を行う方法について説明します。

1. 特定の文字数制限を設ける

ユーザーが入力する文字列の長さを制限することができます。

以下のサンプルコードでは、最大文字数を設定し、それを超える入力を拒否します。

#include <iostream>
#include <string>
int main() {
    std::string input; // 入力を格納するための変数
    const int maxLength = 10; // 最大文字数
    std::cout << "最大" << maxLength << "文字の文字列を入力してください: "; // ユーザーへのメッセージ
    std::getline(std::cin, input); // 標準入力から文字列を取得
    // 文字数制限のチェック
    if (input.length() > maxLength) {
        std::cout << "入力された文字列は" << maxLength << "文字を超えています。" << std::endl;
    } else {
        std::cout << "入力された文字列: " << input << std::endl; // 入力された文字列を表示
    }
    return 0;
}
最大10文字の文字列を入力してください: C++プログラミング
入力された文字列は10文字を超えています。

2. 入力内容のトリミング

ユーザーが入力した文字列の前後に余分な空白が含まれている場合、それを取り除くことができます。

以下のサンプルコードでは、std::stringのメンバ関数を使ってトリミングを行います。

#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); // 標準入力から文字列を取得
    input = trim(input); // トリミングを実行
    std::cout << "トリミングされた文字列: '" << input << "'" << std::endl; // トリミングされた文字列を表示
    return 0;
}
文字列を入力してください:   C++ プログラミング  
トリミングされた文字列: 'C++ プログラミング'

3. 入力内容の検証

ユーザーが入力した内容が特定の条件を満たすかどうかを検証することも重要です。

以下のサンプルコードでは、入力された文字列が数字のみで構成されているかをチェックします。

#include <iostream>
#include <string>
#include <cctype> // std::isdigitを使用するために必要
bool isNumeric(const std::string& str) {
    for (char c : str) {
        if (!std::isdigit(c)) {
            return false; // 数字以外の文字が含まれている場合
        }
    }
    return true; // すべて数字の場合
}
int main() {
    std::string input; // 入力を格納するための変数
    std::cout << "数字のみの文字列を入力してください: "; // ユーザーへのメッセージ
    std::getline(std::cin, input); // 標準入力から文字列を取得
    if (isNumeric(input)) {
        std::cout << "入力された文字列は数字です: " << input << std::endl; // 数字の場合
    } else {
        std::cout << "無効な入力です。数字のみを入力してください。" << std::endl; // エラーメッセージ
    }
    return 0;
}
数字のみの文字列を入力してください: 12345
入力された文字列は数字です: 12345

これらのテクニックを活用することで、ユーザーからの入力をより柔軟に処理し、エラーを防ぐことができます。

入力内容の制限やトリミング、検証を行うことで、プログラムの信頼性を向上させることができます。

std::cinを使った文字列入力の実践例

ここでは、std::cinを使用した文字列入力の実践的な例をいくつか紹介します。

これにより、実際のプログラムでどのように文字列入力を活用できるかを理解することができます。

1. ユーザー情報の入力

ユーザーから名前と年齢を入力してもらい、その情報を表示するプログラムの例です。

#include <iostream>
#include <string>
int main() {
    std::string name; // 名前を格納するための変数
    int age; // 年齢を格納するための変数
    std::cout << "名前を入力してください: "; // ユーザーへのメッセージ
    std::getline(std::cin, name); // 名前の入力を取得
    std::cout << "年齢を入力してください: "; // ユーザーへのメッセージ
    std::cin >> age; // 年齢の入力を取得
    std::cout << "こんにちは、" << name << "さん!あなたは" << age << "歳ですね。" << std::endl; // 入力された情報を表示
    return 0;
}
名前を入力してください: 山田太郎
年齢を入力してください: 25
こんにちは、山田太郎さん!あなたは25歳ですね。

2. 複数の単語を含むフルネームの入力

ユーザーからフルネームを入力してもらい、姓と名を分けて表示するプログラムの例です。

#include <iostream>
#include <string>
#include <sstream> // std::stringstreamを使用するために必要
int main() {
    std::string fullName; // フルネームを格納するための変数
    std::string firstName, lastName; // 名と姓を格納するための変数
    std::cout << "フルネームを入力してください(姓 名): "; // ユーザーへのメッセージ
    std::getline(std::cin, fullName); // フルネームの入力を取得
    std::istringstream iss(fullName); // 文字列をストリームに変換
    iss >> lastName >> firstName; // 姓と名を分けて取得
    std::cout << "姓: " << lastName << ", 名: " << firstName << std::endl; // 姓と名を表示
    return 0;
}
フルネームを入力してください(姓 名): 山田 太郎
姓: 山田, 名: 太郎

3. 複数の趣味をカンマ区切りで入力

ユーザーから趣味をカンマ区切りで入力してもらい、それをリストとして表示するプログラムの例です。

#include <iostream>
#include <string>
#include <vector> // std::vectorを使用するために必要
int main() {
    std::string hobbiesInput; // 趣味の入力を格納するための変数
    std::vector<std::string> hobbies; // 趣味を格納するためのベクター
    std::cout << "趣味をカンマ区切りで入力してください: "; // ユーザーへのメッセージ
    std::getline(std::cin, hobbiesInput); // 趣味の入力を取得
    // カンマで分割して趣味をベクターに格納
    std::string hobby;
    size_t pos = 0;
    while ((pos = hobbiesInput.find(',')) != std::string::npos) {
        hobby = hobbiesInput.substr(0, pos); // カンマ前の趣味を取得
        hobbies.push_back(hobby); // ベクターに追加
        hobbiesInput.erase(0, pos + 1); // カンマを削除
    }
    hobbies.push_back(hobbiesInput); // 最後の趣味を追加
    std::cout << "あなたの趣味: " << std::endl; // 趣味のリストを表示
    for (const auto& h : hobbies) {
        std::cout << "- " << h << std::endl; // 各趣味を表示
    }
    return 0;
}
趣味をカンマ区切りで入力してください: 読書, 映画鑑賞, 旅行
あなたの趣味: 
- 読書
- 映画鑑賞
- 旅行

これらの実践例を通じて、std::cinを使った文字列入力のさまざまな活用方法を学ぶことができます。

ユーザーからの入力を効果的に処理することで、よりインタラクティブなプログラムを作成することが可能です。

まとめ

この記事では、C++におけるstd::cinを使用した文字列入力の基本から応用までを振り返りました。

具体的には、単純な文字列の取得方法や複数単語の入力、エラー処理、さらには実践的な例を通じて、ユーザーからの入力を効果的に扱う方法を紹介しました。

これを機に、実際のプログラムにおいてユーザーインターフェースを向上させるために、さまざまな入力手法を試してみてください。

関連記事

Back to top button