C++ で文字列をどのようにトークンに分割しますか?
6 に答える
これは私にとってはうまく機能します:)、結果はelems
. delim
任意のことができますchar
。
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
Boostを含むこのMingwディストリビューションでは:
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <ostream>
#include <algorithm>
#include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost;
int main() {
vector<string> v;
split(v, "1=2&3=4&5=6", is_any_of("=&"));
copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));
}
C 関数strtokを使用できます。
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
Boost Tokenizerも次のように機能します。
#include<iostream>
#include<boost/tokenizer.hpp>
#include<string>
int main(){
using namespace std;
using namespace boost;
string s = "This is, a test";
tokenizer<> tok(s);
for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
cout << *beg << "\n";
}
}
String Algo ライブラリの boost::split も参照してください。
string str1("こんにちは abc-*-ABC-*-aBc さようなら"); vector<string> トークン; boost::split(tokens, str1, boost::is_any_of("-*")); // トークン == { "こんにちは abc","ABC","aBc さようなら" }
stringstream を使用してみてください:
std::string line("A line of tokens");
std::stringstream lineStream(line);
std::string token;
while(lineStream >> token)
{
}
あなたの最後の質問に対する私の答えをチェックしてください:
C++ Reading file Tokens
これは、トークン区切り文字がどの程度複雑であるか、および複数ある場合によって異なります。簡単な問題の場合は、std::istringstream と std::getline を使用してください。より複雑なタスクの場合、または STL に準拠した方法でトークンを反復処理する場合は、Boost の Tokenizer を使用します。もう 1 つの可能性 (これら 2 つのどちらよりも厄介ですが) は、std::string::find を呼び出し、最後に見つかったトークンの位置を更新して、次のトークンを検索するための開始点にする while ループを設定することです。しかし、これはおそらく 3 つのオプションの中で最もバグが発生しやすいものです。