C++でStringTokenizerっぽいことをやってみる
C++を書いていて、JavaのSttringTokenizerのようなことをやりたいことがある。C++標準ライブラリだけで書いてみた。
void slice(const std::string source,
const std::string dem,
std::vector<std::string> *retval)
{
std::string::size_type i1 = 0;
std::string::size_type i2 = source.find(dem);
if(std::string::npos == i2)
return;
std::string s = source + dem;
do{
retval->push_back(s.substr(i1, i2-i1));
i1 = i2+1;
}while(std::string::npos != (i2 = s.find(dem, i1)));
}
この関数は、sourceで指定した文字列をdemで指定した文字で切り分けて、切り分けた結果をretvalで指定したヴェクタに格納ものである。テストしてみると。
using namespace std;
int main(void)
{
string source =
"DCV_,___,___,-00.0073E-3,DCV_,___,___,+00.000E-3,6247865";
vector<string> vec;
vec.clear();
slice(source, ",", &vec);
if(vec.empty()){
cout<< "not found"<< endl;
return -1;
}
cout<< vec[3]<< " "<< vec[7]<< endl;
return 0;
}
$ ./a.out
-00.0073E-3 +00.000E-3
ちゃんと値は切り出せている。listに結果を格納するようにすれば、もっとStringTokenizerっぽくなるかな。
Categories
programming1 TrackBacks
Listed below are links to blogs that reference this entry: C++でStringTokenizerっぽいことをやってみる.
TrackBack URL for this entry: http://www.argv.org/~chome/blog/mt-tb.cgi/76
» 続・C++でStringTokenizerっぽいことをやってみる from NoiseFactory
前回の記事のhaveの指摘に従い、参照渡しをやめてヴェクタを返す関数にしてみた... Read More

おぬしも好きだのう。
結果をポインタ引数の指すアドレスに入れるのがC++っぽくない気がするなぁ。
クラス化してないからべつにいいのかな。
つーか、組みたいプログラムを組んでないなぁ、ここ数年。やばい。枯れてしまう。
実はこのコードは、学部生のときに初めて書いたもの。今回測定器からの出力から値を取るためにまた書いたので、メモ代わりにネタにしました。なんか何年かに一回は同じようなコードを書いている気がするし。
参照渡しはダメ?ヴェクタを返す関数にすべきかな?
そうするとアトミックになるのでマルチスレッドでも安全に使えようになるね。メモリ効率はわずかに落ちるけど、利点はこれを補ってあまりある。すばらしい。