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

C++のstringstream(文字列ストリーム)とは?基本の使い方と実践例を解説

本記事では、C++におけるstringstream(文字列ストリーム)について詳しく解説します。stringstreamは、文字列オブジェクトをストリームとして扱うためのクラスで、<sstream>ヘッダをインクルードすることで利用できます。

stringstreamを使うと、cinから入力を読み込むのと同じように、文字列をあたかもストリームであるかのように操作できます。これにより、文字列の解析や数値変換などを直感的なコードで実現できます。

stringstreamの主なメソッド

stringstreamには、以下のような主要なメソッドや演算子が用意されています。

clear():ストリームの状態をクリア(リセット)します。エラー状態の解除にも使用されます。

str():ストリームに格納されている文字列オブジェクトを取得・設定します。

operator <<:stringstreamに文字列や値を追加(書き込み)します。

operator >>:stringstreamから値を読み取ります。空白区切りでデータを抽出する際に便利です。

実例1:文字列を単語ごとに分割する

まず、stringstreamを使って文字列を空白で区切り、個別の単語として分割する例を見てみましょう。operator >>はデフォルトで空白文字を区切りとして扱うため、ループと組み合わせるだけで簡単に単語分割が実装できます。

サンプルコード

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main() {
    string str("Hello from the dark side");
    string tmp; // 各反復で単語を格納する文字列
    stringstream str_strm(str);
    vector<string> words; // 単語を保持するベクターを作成
    while (str_strm >> tmp) {
        // ここでtmpの妥当性チェック(空チェックなど)を行う
        // また、!や.や?などの記号を除去することも可能
        // 最後にベクターへ追加する
        words.push_back(tmp);
    }
    for(int i = 0; i<words.size(); i++)
        cout << words[i] << endl;
}

実行結果

Hello
from
the
dark
side

このように、whileループの条件としてstr_strm >> tmpを直接記述することで、読み取る単語がなくなるまで自動的にループが続きます。抽出した単語はvectorに格納され、後から自由に利用できます。

実例2:10進数を16進数に変換する

次に、stringstreamを使った数値変換の例を紹介します。hexマニピュレータをoperator <<と組み合わせることで、10進数の整数を簡単に16進数の文字列へ変換できます。

サンプルコード

#include<iostream>
#include<sstream>
using namespace std;
main(){
    int decimal = 61;
    stringstream my_ss;
    my_ss << hex << decimal;
    string res = my_ss.str();
    cout << "The hexadecimal value of 61 is: " << res;
}

実行結果

The hexadecimal value of 61 is: 3d

my_ss << hex << decimal;の一行で、整数値61が16進数表記の「3d」としてストリームに書き込まれます。その後、str()メソッドで変換結果を文字列として取得しています。同様に、octを使えば8進数への変換も可能です。

まとめ

stringstreamは、文字列とストリーム操作を橋渡しする強力なツールです。単語の分割、数値と文字列の相互変換、文字列のフォーマットなど、さまざまな場面で活用できます。標準ライブラリだけで完結するため、追加の依存関係なしに手軽に使える点も大きな魅力です。

  1. C++で文字列をトークン化する方法:stringstreamとgetline()による分割テクニック

    この記事では、C++における文字列のトークン化(分割)の方法について解説します。C言語では、文字配列に対してstrtok()関数を使用することで文字列を分割できましたが、C++ではstd::stringクラスを扱うため、少し異なるアプローチが必要です。C++の機能を活用して文字列を分割するには、まずstd::stringをstringstream(文字列ストリーム)に変換します。その後、getline()関数を使うことで、指定した区切り文字(デリミタ)ごとに文字列を切り出すことができます。getline()関数は、以下の3つの引数を受け取ります。入力元となる文字列ストリーム出力結果を格納する文

  2. C++で文字列をトークン化(分割)する2つの方法を解説

    文字列のトークン化(分割)とは、1つの文字列を区切り文字(スペースやカンマなど)を基準に、複数の部分文字列へ分割する処理のことです。C++では、標準ライブラリだけでもいくつかの方法で実現できます。本記事では、代表的な2つの方法をサンプルコード付きで紹介します。方法1:stringstreamを使って空白で分割する1つ目の方法は、stringstreamを使ってスペースで区切られた単語を順に読み取る方法です。この方法はやや制限がありますが、適切なチェックを加えれば十分に目的を果たすことができます。サンプルコード#include <vector> #include <string