読者です 読者をやめる 読者になる 読者になる

物理の研究の備忘録

高エネルギー物理学とかいうマニアックな研究分野の博士課程にいるわたしの備忘録。主にPCの設定とか

c++でstd::stringを分割する方法のメモ

stringで文字列を定義した時に途中で分割する必要が出てきた。

例えば "8:3"という文字列を:で区切って8と3をそれぞれ取り出したい場合について考える。

調べるとそれっぽいページが出てきたのでやってみる。

C++ 文字列クラス std::string 入門

 

どうやらstdには標準で文字列を分割する関数がないので自分で実装する必要があるらしい。以下コードコピペ

#include <vector>
#include <string>
#include <sstream>      // std::ostringstream
std::vector<std::string> StringSplit(const std::string &str, char sep)
{
    std::vector<std::string> v;
    std::stringstream ss(str);
    std::string buffer;
    while( std::getline(ss, buffer, sep) ) {
        v.push_back(buffer);
    }
    return v;
}

使ってみる。

vector<string> vkey = StringSplit("8:3",':');

const string str_key1= vkey[0];

const string str_key2= vkey[1];

 

とかやれば確かに8と3に分割できた。

 

中身で何をやってるのか

inputの文字列をstringstreamにつっこみ、ある文字sepまでの文字列を

getlineで引っ張ってくる。while文でsepより前とsepより後の文字列を

vectorに順番に突っ込んでvectorを返り値として返す、みたいなことをやってるはず。

getlineは第3引数(sep)が現れるまでの文字を出力する仕様みたい。

 

””と''て何が違うんだっけ?と思ったが、文字列は""だけど一文字の場合は''で囲めばいいんだった。忘れてた。

これで分割し放題だ!

 

 【追記】

このままだと数字はstring型として扱われるので、int型とかに変換したかったら

stoi(str_key1)

とかすれば良い。