私はsscanf
のC++に相当するものを探しています。文字列を正しくトークン化するには
string a,b,c;
string line = "data1,data2,data3";
私はdata1
からdata2
b
へとdata3
、"a"
にc
を割り当てる行う方法。
私はsscanf
のC++に相当するものを探しています。文字列を正しくトークン化するには
string a,b,c;
string line = "data1,data2,data3";
私はdata1
からdata2
b
へとdata3
、"a"
にc
を割り当てる行う方法。
区切り文字が1文字の場合は、std::istringstream
とカスタム区切り文字を使用してstd::getline
を使用できます。
const auto text = std::string {"alpha,beta,gamma"};
const auto delim = ',';
auto token = std::string {};
auto iss = std::istringstream {text};
while (std::getline(iss, token, delim))
std::cout << "Parsed token: '" << token << "'\n";
また、regular expressionを使用することもできます。
const auto text = std::string {"alpha,beta,gamma"};
const auto pattern = std::regex {"[^,]+"};
const auto first = std::sregex_iterator {text.cbegin(), text.cend(), pattern};
const auto last = std::sregex_iterator {};
for (auto it = first; it != last; ++it)
std::cout << "Parsed token: '" << it->str() << "'\n";
いずれのソリューションも、おそらくstd::sscanf
を使用するよりもはるかに遅くなります。
あなたの場合、,
を含むstring
を分割したいとします。これを実現するにはgetline
とstringstream
を使用できます。
まず、あなたはその後stringstream
stringstream ss(line);
を使用してストリームにstring
を変更、あなたがtmp
を使用することができ、最終的には,
while(getline(ss,tmp,',')) //Here you use string tmp to save it
デリミタ使用して、それを分割するgetline
を使用することができますし、それをvector <string>
に押し込みます。ここには完全なプログラムの例があります。
#include<bits/stdc++.h>
#include<sstream>
using namespace std;
int main(){
string line = "data1,data2,data3";
stringstream ss(line);
vector <string> result;string tmp;
while(getline(ss,tmp,',')){
result.push_back(tmp);
}
return 0;
}