【发布时间】:2016-07-13 19:17:18
【问题描述】:
我正在寻找与 sscanf 等效的 c++。
string a,b,c;
string line = "data1,data2,data3";
如何将data1 分配给"a",将data2 分配给b,将data3 分配给c。
【问题讨论】:
我正在寻找与 sscanf 等效的 c++。
string a,b,c;
string line = "data1,data2,data3";
如何将data1 分配给"a",将data2 分配给b,将data3 分配给c。
【问题讨论】:
在您的情况下,您希望拆分包含 , 作为限制的 string。您可以使用getline 和stringstream 来实现此目的。
首先,您将string 更改为使用stringstream 的流
stringstream ss(line);
之后,您可以使用getline使用分隔符,对其进行拆分
while(getline(ss,tmp,',')) //Here you use string tmp to save it
最后,您可以使用tmp 并将其推送到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;
}
【讨论】:
如果您的分隔符是单个字符,您可以将 std::getline 与 std::istringstream 和自定义分隔符一起使用。
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 慢得多。
【讨论】: