標準入出力

[C++] cinの入力文字列を空白区切りで分割する方法

C++でcinを使用して入力文字列を空白区切りで分割するには、標準入力ストリームの性質を利用します。

cinはデフォルトで空白文字(スペース、タブ、改行)を区切りとして入力を読み取ります。

そのため、ループ内でcin >>変数を使うと、空白区切りで1単語ずつ取得できます。

入力が複数単語の場合、std::vectorstd::stringを用いて格納することが一般的です。

空白区切りで入力を分割する方法

C++では、標準入力から受け取った文字列を空白で区切って分割することができます。

これにより、ユーザーからの入力を効率的に処理することが可能です。

以下に、具体的な方法を示します。

1. std::cinを使用した入力

std::cinを使って、ユーザーからの入力を受け取ります。

入力された文字列は、空白で区切られた単語として処理されます。

2. std::istringstreamを利用した分割

std::istringstreamを使用することで、入力された文字列を簡単に分割することができます。

以下にサンプルコードを示します。

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
int main() {
    std::string input; // 入力用の文字列
    std::cout << "空白区切りの文字列を入力してください: ";
    std::getline(std::cin, input); // 標準入力から文字列を取得
    std::istringstream iss(input); // 文字列ストリームを作成
    std::vector<std::string> words; // 単語を格納するベクター
    std::string word; // 単語を格納する変数
    while (iss >> word) { // ストリームから単語を取得
        words.push_back(word); // 単語をベクターに追加
    }
    // 結果を表示
    std::cout << "分割された単語:" << std::endl;
    for (const auto& w : words) {
        std::cout << w << std::endl; // 各単語を表示
    }
    return 0; // プログラムの終了
}
空白区切りの文字列を入力してください: C++ プログラミング は面白い
分割された単語:
C++
プログラミング
は面白い

3. コードの解説

  • std::getline(std::cin, input)を使用して、ユーザーからの入力を一行取得します。
  • std::istringstreamを使って、取得した文字列をストリームに変換します。
  • while (iss >> word)のループで、空白で区切られた単語を一つずつ取得し、std::vectorに格納します。
  • 最後に、分割された単語を表示します。

この方法を使うことで、簡単に空白区切りの入力を分割し、処理することができます。

応用的な入力処理

空白区切りの入力を分割する基本的な方法を理解したところで、次は応用的な入力処理について考えてみましょう。

ここでは、異なるデータ型の入力や、エラーハンドリング、複数行の入力処理について説明します。

1. 異なるデータ型の入力

ユーザーからの入力が整数や浮動小数点数など、異なるデータ型である場合、適切に処理する必要があります。

以下のサンプルコードでは、整数と文字列を混在させた入力を処理します。

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
int main() {
    std::string input; // 入力用の文字列
    std::cout << "整数と文字列を空白区切りで入力してください: ";
    std::getline(std::cin, input); // 標準入力から文字列を取得
    std::istringstream iss(input); // 文字列ストリームを作成
    std::vector<int> numbers; // 整数を格納するベクター
    std::string word; // 単語を格納する変数
    while (iss >> word) { // ストリームから単語を取得
        try {
            int number = std::stoi(word); // 文字列を整数に変換
            numbers.push_back(number); // 整数をベクターに追加
        } catch (const std::invalid_argument&) {
            // 整数に変換できない場合は無視
        }
    }
    // 結果を表示
    std::cout << "入力された整数:" << std::endl;
    for (const auto& num : numbers) {
        std::cout << num << std::endl; // 各整数を表示
    }
    return 0; // プログラムの終了
}
整数と文字列を空白区切りで入力してください: 10 apple 20 banana 30
入力された整数:
10
20
30

2. エラーハンドリング

上記のコードでは、std::stoiを使用して文字列を整数に変換していますが、変換できない場合には例外が発生します。

try-catchブロックを使用して、エラーを適切に処理しています。

これにより、無効な入力を無視し、プログラムがクラッシュするのを防ぎます。

3. 複数行の入力処理

複数行の入力を処理する場合、std::getlineをループで使用することができます。

以下のサンプルコードでは、複数行の空白区切りの入力を処理します。

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
int main() {
    std::string line; // 行単位の入力用の文字列
    std::vector<std::string> allWords; // すべての単語を格納するベクター
    std::cout << "複数行の空白区切りの文字列を入力してください (終了するには空行を入力):" << std::endl;
    
    while (true) {
        std::getline(std::cin, line); // 行を取得
        if (line.empty()) break; // 空行で終了
        std::istringstream iss(line); // 文字列ストリームを作成
        std::string word; // 単語を格納する変数
        while (iss >> word) { // ストリームから単語を取得
            allWords.push_back(word); // 単語をベクターに追加
        }
    }
    // 結果を表示
    std::cout << "入力された単語:" << std::endl;
    for (const auto& w : allWords) {
        std::cout << w << std::endl; // 各単語を表示
    }
    return 0; // プログラムの終了
}
複数行の空白区切りの文字列を入力してください (終了するには空行を入力):
C++ プログラミング
は面白い
空行を入力:
入力された単語:
C++
プログラミング
は面白い

4. コードの解説

  • 異なるデータ型の入力では、std::stoiを使って文字列を整数に変換し、変換できない場合は例外処理を行います。
  • 複数行の入力では、空行が入力されるまでループを続け、各行を処理します。
  • これにより、ユーザーからの多様な入力を柔軟に処理することができます。

このように、C++ではさまざまな方法で入力を処理することができ、プログラムの柔軟性を高めることができます。

実践例:空白区切りの入力を処理するプログラム

ここでは、空白区切りの入力を処理する実践的なプログラムの例を示します。

このプログラムでは、ユーザーからの入力を受け取り、各単語の長さを計算し、単語のリストとその長さを表示します。

1. プログラムの概要

このプログラムは、以下の機能を持っています。

  • ユーザーから空白区切りの文字列を入力として受け取る。
  • 各単語の長さを計算する。
  • 単語とその長さを表示する。

2. サンプルコード

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
int main() {
    std::string input; // 入力用の文字列
    std::cout << "空白区切りの文字列を入力してください: ";
    std::getline(std::cin, input); // 標準入力から文字列を取得
    std::istringstream iss(input); // 文字列ストリームを作成
    std::vector<std::string> words; // 単語を格納するベクター
    std::string word; // 単語を格納する変数
    while (iss >> word) { // ストリームから単語を取得
        words.push_back(word); // 単語をベクターに追加
    }
    // 結果を表示
    std::cout << "入力された単語とその長さ:" << std::endl;
    for (const auto& w : words) {
        std::cout << w << " の長さ: " << w.length() << std::endl; // 各単語とその長さを表示
    }
    return 0; // プログラムの終了
}
空白区切りの文字列を入力してください: C++ プログラミング は面白い
入力された単語とその長さ:
C++ の長さ: 2
プログラミング の長さ: 6
は面白い の長さ: 6

3. コードの解説

  • std::getline(std::cin, input)を使用して、ユーザーからの入力を一行取得します。
  • std::istringstreamを使って、取得した文字列をストリームに変換します。
  • while (iss >> word)のループで、空白で区切られた単語を一つずつ取得し、std::vectorに格納します。
  • 最後に、各単語とその長さを表示します。

w.length()を使用して、単語の長さを計算しています。

このプログラムは、空白区切りの入力を処理する基本的な例ですが、実際のアプリケーションでは、ユーザーからの入力を柔軟に処理するための基盤となります。

さまざまな機能を追加することで、より複雑な処理を行うことも可能です。

まとめ

この記事では、C++における空白区切りの入力を分割する方法や、応用的な入力処理について詳しく解説しました。

基本的な入力処理から、異なるデータ型の扱いや複数行の入力処理まで、さまざまなテクニックを紹介し、実践的なプログラム例を通じて具体的な実装方法を示しました。

これらの知識を活用して、より複雑な入力処理を行うプログラムを作成してみてください。

関連記事

Back to top button