C++で文字列からすべての整数を抽出する方法
本記事では、C++において数字と数字以外の文字が混在する文字列から、すべての整数値を抽出する方法を解説します。
この問題を解決するには、C++標準ライブラリのstringstreamクラスを利用します。基本的な考え方は、対象の文字列を単語(スペース区切りのトークン)ごとに切り分け、それぞれを整数型(int)に変換できるかどうかを試すというものです。変換に成功すれば、その単語は整数であると判断でき、値を出力します。
入出力の例
入力:数字を含む文字列 "Hello 112 World 35 75" 出力:112 35 75
アルゴリズム
ステップ1:数値を含む文字列を受け取る ステップ2:文字列を単語ごとに分割する ステップ3:単語が整数型に変換できる場合は、その値を出力する ステップ4:終了
サンプルコード
#include<iostream>
#include<sstream>
using namespace std;
void getNumberFromString(string s) {
stringstream str_strm;
str_strm << s; // 文字列sをstringstreamに変換
string temp_str;
int temp_int;
while(!str_strm.eof()) {
str_strm >> temp_str; // 単語を1つずつtemp_strに読み込む
if(stringstream(temp_str) >> temp_int) { // int型への変換を試みる
cout << temp_int << " ";
}
temp_str = ""; // 一時文字列をクリア
}
}
main() {
string my_str = "Hello 112 World 35 75";
getNumberFromString(my_str);
}実行結果
112 35 75
コードの解説
まず、文字列sをstringstreamオブジェクトstr_strmに流し込みます。これにより、文字列をストリームとして扱えるようになり、>>演算子でスペース区切りごとに単語を読み取れるようになります。
whileループ内では、ストリームの終端(eof)に達するまで単語を1つずつtemp_strに取り出します。そしてstringstream(temp_str) >> temp_intという一時的なstringstreamを作成し、その単語が整数として解析できるかを判定しています。この式は変換に成功した場合に真と評価されるため、if文でそのまま利用できます。変換に成功した単語のみが標準出力に出力されます。
注意点
この手法では、単語全体が整数として解釈できる場合のみ抽出されます。たとえば「abc123」のように英字と数字が混ざったトークンや、「12.5」のような小数は整数として変換できないため、出力されません。また、負の数(例:「-42」)は単語として独立していれば正しく抽出できます。文字列中の記号や位置に関係なく数値部分だけを抜き出したい場合は、正規表現(std::regex)や文字ごとの走査といった別のアプローチを検討するとよいでしょう。
-
C++を使って文字列から特定の単語を削除する方法
本記事では、与えられた文字列から指定した単語を削除する問題を解説します。まず、具体的な例を見てみましょう。入力 : str = remove a given word, word = remove 出力 : a given word 入力 : str = god is everywhere, word = is 出力 : god everywhere解決のためのアプローチ文字列から特定の単語を削除するには、シンプルな手法を用いることができます。手順は以下の通りです。まず、与えられた文字列を2次元配列(マトリックス)形式に変換し、各行に1つの単語を格納します。マトリックス内から対象の単語を検索
-
C++で文字列から二分木を構築する方法
括弧と整数から構成される文字列が与えられたとき、その文字列から二分木を構築する問題を考えてみましょう。入力文字列全体が一つの二分木を表しており、整数の後に0個、1個、または2組の括弧が続く形式になっています。整数はルート(根)ノードの値を表し、各括弧のペアは同じ構造を持つ子の部分木を含んでいます。問題の例例えば、入力が 4(2(3)(1))(6(5)) のような文字列だった場合、出力は [3,2,1,4,5,6](中順走査・inorder traversal の結果)となります。解決アプローチこの問題を解くために、以下の手順に従います。再帰関数 solve() を定義します。引数として文字列