【问题标题】:How to properly Tokenize a string如何正确标记字符串
【发布时间】:2016-07-13 19:17:18
【问题描述】:

我正在寻找与 sscanf 等效的 c++。

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

如何将data1 分配给"a",将data2 分配给b,将data3 分配给c

【问题讨论】:

    标签: c++ string token


    【解决方案1】:

    在您的情况下,您希望拆分包含 , 作为限制的 string。您可以使用getlinestringstream 来实现此目的。

    首先,您将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;
    }
    

    【讨论】:

      【解决方案2】:

      如果您的分隔符是单个字符,您可以将 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";
      

      或者您可以使用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 慢得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多