C++库里也没有提供字符串分隔函数,所以很难直接一行代码直接分隔出来,不像其它语言那样方便。

要么就是拿getlinestringstream手动实现一个字符串分隔函数。

感觉还是背一个版本的字符串分隔函数比较好,下次遇到需要字符串分隔的地方直接快速写出来。

我提供一个我经常写的一个版本。可以按照分隔符分隔,分隔符可以是单个字符或者一个字符串,而且可以很好处理重复的分隔符:

vector<string> split(string s, const string d) {
    if (s.empty()) return {};
    vector<string> res;
    std::string strs = s + d;
    size_t pos = strs.find(d);
    size_t len = strs.size();
    while (pos != string::npos) {
        string x = strs.substr(0, pos);
        if (x!="") res.push_back(x);
        strs = strs.substr(pos+d.size(), len);
        pos = strs.find(d);
    }
    return res;
}

或者,其它的方法,大家可以参考学一下,我在github页面记录的

   std::vector<std::string> split_v1(std::string & str) {
     std::istringstream iss(str);
     return std::vector<std::string>(std::istream_iterator<std::string>{iss}, std::istream_iterator<std::string>());
   }
   /////////////////////////////////////////////////////////////////////////////
   template<char delimiter>
   class  MyString : public std::string {};
   template<char delimiter>
   std::istream& operator>>(std::istream& is, MyString<delimiter>& output) {
     std::getline(is, output, delimiter);
     return is;
   }
   template<char delimiter>
   std::vector<std::string> split_v2(std::string& str) {
     std::istringstream iss(str);
     return std::vector<std::string>(std::istream_iterator<MyString<delimiter>>{iss}, std::istream_iterator<MyString<delimiter>>());
   }
   /////////////////////////////////////////////////////////////////////////////
   std::vector<std::string> split_v3(const std::string& s, char delimiter) {
     std::vector<std::string> tokens;
     std::string token;
     std::istringstream token_stream(s);
     while (std::getline(token_stream, token, delimiter)) {
       tokens.push_back(token);
     }
     return tokens;
   }

split_v1方法简单,只使用了STL的东西,由于istringstream的特性,这里只能按空格切割字符串。
split_v2可以通过template在编译器指定分隔符。
split_v3在运行时决定分隔符。