ちゃっくのメモ帳

ちゃっくがメモしときたいことをメモしとくよ

stringstreamを使ってみたんだよ

C++でstringstreamを使ってみた。

空白区切り

何がしたかったかというとC++で空白区切りの文字列を処理したかった。
しかし、C++にはsplit関数がない。そこでstringstreamが使えるらしい。
ソースコード

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main(){
    string s = "abc def ghi jkl mno";
    stringstream ss;

    ss << s;
    string ret;
    while(!ss.eof()){
        ss >> ret;
        cout << ret << endl;
    }
}

出力

abc
def
ghi
jkl
mno

のようになる。

文字列から数値への変換

stringstreamを使えば文字列を数値に変換することもできるらしい
ソースコード

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(){
    string s ="3.141592";
    stringstream ss;
    double pi;

    ss << s;
    ss >> pi;
    cout << pi << endl;
}

出力

3.141592

また文字列が数字とそれ以外が混ざっていた場合次のようになる

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main(){
    string s1 = "3.14aaa";
    string s2 = "aa3.14";
    string s3 = "aa3.14aa";
    string s4 = "3.1hoge415";
    stringstream ss1,ss2,ss3,ss4;
    double d1=0,d2=0,d3=0,d4=0;

    ss1 << s1;
    ss2 << s2;
    ss3 << s3;

    ss1 >> d1;
    cout << d1 << endl;
    ss2 >> d2;
    cout << d2 << endl;
    ss3 >> d3;
    cout << d3 << endl;
    ss4 >> d4;
    cout << d4 << endl;
}

出力

3.14
0
0
3.1

読み飛ばし

ignoreを使えば読み飛ばしができる。
ignore(n,delim)で
「最大n文字を読み飛ばす。もしくはdelimに一致するするまで読み飛ばす。」
となる。
但し引数がなければignore(1,EOF)となる。

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(){
    string s = "123,456";
    stringstream ss;
    int r1,r2;
    ss << s;
    ss >> r1;
    ss.ignore();
    ss >> r2;
    cout << r1 << " : " << r2 << endl;
}
123 : 456