C++で文を単語ごとに分割する方法
今回は、与えられた文を単語ごとに分割する方法を解説します。文中に含まれるすべての単語を取り出し、1行に1単語ずつ出力していきます。
入力例と出力例
入力
I am a good boy
出力
I am a good boy
このように、元の文に含まれる各単語を1行ずつ出力するのが目標です。
サンプルコード1
#include <iostream>
#include <string>
using namespace std;
void split(string st){
string word = "";
for (char s : st){
if (s == ' '){
cout << word << endl;
word = "";
}
else{
word = word + s;
}
}
cout << word << endl;
}
int main(){
string st = "Blood from heaven is mortal";
cout << "Blood from heaven is mortal" << endl;
split(st);
return 0;
}実行結果
上記のコードを実行すると、次のような出力が得られます。
Blood from heaven is mortal Blood from heaven is mortal
サンプルコード2
#include <iostream>
#include <string>
using namespace std;
void split(string st){
string word = "";
for (char s : st){
if (s == ' '){
cout << word << endl;
word = "";
}
else{
word = word + s;
}
}
cout << word << endl;
}
int main(){
string st = "type a text message";
cout << "type a text message" << endl;
split(st);
return 0;
}実行結果
上記のコードを実行すると、次のような出力が得られます。
type a text message type a text message
プログラムの仕組み
このプログラムの動作はシンプルで、以下の手順で処理が進みます。
まず、空の文字列変数 word を用意し、範囲ベースforループで文を1文字ずつ走査します。読み取った文字がスペースであれば、それまで蓄積していた word の内容を出力してリセットします。スペース以外の文字であれば、その文字を word に連結していきます。
ループが終わった後も、最後の単語はまだ出力されていないため、ループ終了後に word を出力しています。これにより、文末の単語も正しく表示されます。
なお、C++11以降では stringstream を使うことで、より簡潔に同様の処理を実現することも可能です。用途や可読性の要件に応じて、実装方法を選択するとよいでしょう。
-
C++で解く「迷路 II」問題 ― 壁に当たるまで転がるボールの最短距離をBFSで求める
問題概要 空きマスと壁からなる迷路の中にボールがあります。ボールは上・下・左・右のいずれかの方向に転がって空きマスを進むことができますが、壁にぶつかるまで止まることはできません。ボールが停止したときに、初めて次の方向を選ぶことができます。 ボールのスタート位置、目的地、そして迷路そのものが与えられるので、ボールが目的地で停止するまでの最短距離を求めてください。ここでの距離とは、ボールが転がって通過した空きマスの数のことです(スタート位置は含まず、目的地は含みます)。どうしても目的地で停止できない場合は -1 を返します。 迷路は2次元配列で表現されます。1 が壁、0 が空きスペースを意味し、迷
-
C++で解く迷路問題:転がるボールが目的地に止まれるかをBFSで判定する方法
迷路の中にボールがあるとします。迷路には空きスペース(通路)と壁があります。ボールは上下左右のいずれかの方向に転がって空き通路を進むことができますが、壁にぶつかるまで止まりません。ボールが停止したときに、次の方向を選べます。この問題では、ボールの開始位置、目的地、そして迷路そのものが与えられ、「ボールが目的地の位置で停止できるかどうか」を判定する必要があります。迷路は2次元配列で表現され、1は壁、0は空きスペースを意味します。迷路の外周はすべて壁になっています。開始位置と目的地は行・列のインデックス(座標)で与えられます。問題例たとえば、次のような2次元配列で表される迷路を考えてみましょう。0