如何正确标记字符串

How to properly Tokenize a string

本文关键字:字符串 何正确      更新时间:2023-10-16

我正在寻找相当于sscanf的c ++。

  string a,b,c;
  string line = "data1,data2,data3";

如何data1分配给"a"data2分配给bdata3分配给c

如果分隔符是单个字符,则可以将std::getlinestd::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";

或者您可以使用正则表达式。

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。您可以使用getlinestringstream来实现此目的。

首先,使用 stringstreamstring更改为流

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;
}