Parse (split) a string in C++ using string delimiter (standard C++)

后端 未结 20 2107
时光说笑
时光说笑 2020-11-21 23:44

I am parsing a string in C++ using the following:

using namespace std;

string parsed,input=\"text to be parsed\";
stringstream input_stringstream(input);

i         


        
相关标签:
20条回答
  • 2020-11-22 00:07

    You can use next function to split string:

    vector<string> split(const string& str, const string& delim)
    {
        vector<string> tokens;
        size_t prev = 0, pos = 0;
        do
        {
            pos = str.find(delim, prev);
            if (pos == string::npos) pos = str.length();
            string token = str.substr(prev, pos-prev);
            if (!token.empty()) tokens.push_back(token);
            prev = pos + delim.length();
        }
        while (pos < str.length() && prev < str.length());
        return tokens;
    }
    
    0 讨论(0)
  • 2020-11-22 00:07

    For string delimiter

    Split string based on a string delimiter. Such as splitting string "adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih" based on string delimiter "-+", output will be {"adsf", "qwret", "nvfkbdsj", "orthdfjgh", "dfjrleih"}

    #include <iostream>
    #include <sstream>
    #include <vector>
    
    using namespace std;
    
    // for string delimiter
    vector<string> split (string s, string delimiter) {
        size_t pos_start = 0, pos_end, delim_len = delimiter.length();
        string token;
        vector<string> res;
    
        while ((pos_end = s.find (delimiter, pos_start)) != string::npos) {
            token = s.substr (pos_start, pos_end - pos_start);
            pos_start = pos_end + delim_len;
            res.push_back (token);
        }
    
        res.push_back (s.substr (pos_start));
        return res;
    }
    
    int main() {
        string str = "adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih";
        string delimiter = "-+";
        vector<string> v = split (str, delimiter);
    
        for (auto i : v) cout << i << endl;
    
        return 0;
    }
    


    Output

    adsf
    qwret
    nvfkbdsj
    orthdfjgh
    dfjrleih
    




    For single character delimiter

    Split string based on a character delimiter. Such as splitting string "adsf+qwer+poui+fdgh" with delimiter "+" will output {"adsf", "qwer", "poui", "fdg"h}

    #include <iostream>
    #include <sstream>
    #include <vector>
    
    using namespace std;
    
    vector<string> split (const string &s, char delim) {
        vector<string> result;
        stringstream ss (s);
        string item;
    
        while (getline (ss, item, delim)) {
            result.push_back (item);
        }
    
        return result;
    }
    
    int main() {
        string str = "adsf+qwer+poui+fdgh";
        vector<string> v = split (str, '+');
    
        for (auto i : v) cout << i << endl;
    
        return 0;
    }
    


    Output

    adsf
    qwer
    poui
    fdgh
    
    0 讨论(0)
  • 2020-11-22 00:08

    This should work perfectly for string (or single character) delimiters. Don't forget to include #include <sstream>.

    std::string input = "Alfa=,+Bravo=,+Charlie=,+Delta";
    std::string delimiter = "=,+"; 
    std::istringstream ss(input);
    std::string token;
    std::string::iterator it;
    
    while(std::getline(ss, token, *(it = delimiter.begin()))) {
        while(*(++it)) ss.get();
        std::cout << token << " " << '\n';
    }
    

    The first while loop extracts a token using the first character of the string delimiter. The second while loop skips the rest of the delimiter and stops at the beginning of the next token.

    0 讨论(0)
  • 2020-11-22 00:10
    std::vector<std::string> parse(std::string str,std::string delim){
        std::vector<std::string> tokens;
        char *str_c = strdup(str.c_str()); 
        char* token = NULL;
    
        token = strtok(str_c, delim.c_str()); 
        while (token != NULL) { 
            tokens.push_back(std::string(token));  
            token = strtok(NULL, delim.c_str()); 
        }
    
        delete[] str_c;
    
        return tokens;
    }
    
    0 讨论(0)
  • 2020-11-22 00:10

    Since this is the top-rated Stack Overflow Google search result for C++ split string or similar, I'll post a complete, copy/paste runnable example that shows both methods.

    splitString uses stringstream (probably the better and easier option in most cases)

    splitString2 uses find and substr (a more manual approach)

    // SplitString.cpp
    
    #include <iostream>
    #include <vector>
    #include <string>
    #include <sstream>
    
    // function prototypes
    std::vector<std::string> splitString(const std::string& str, char delim);
    std::vector<std::string> splitString2(const std::string& str, char delim);
    std::string getSubstring(const std::string& str, int leftIdx, int rightIdx);
    
    
    int main(void)
    {
      // Test cases - all will pass
      
      std::string str = "ab,cd,ef";
      //std::string str = "abcdef";
      //std::string str = "";
      //std::string str = ",cd,ef";
      //std::string str = "ab,cd,";   // behavior of splitString and splitString2 is different for this final case only, if this case matters to you choose which one you need as applicable
      
      
      std::vector<std::string> tokens = splitString(str, ',');
      
      std::cout << "tokens: " << "\n";
      
      if (tokens.empty())
      {
        std::cout << "(tokens is empty)" << "\n";
      }
      else
      {
        for (auto& token : tokens)
        {
          if (token == "") std::cout << "(empty string)" << "\n";
          else std::cout << token << "\n";
        }
      }
        
      return 0;
    }
    
    std::vector<std::string> splitString(const std::string& str, char delim)
    {
      std::vector<std::string> tokens;
      
      if (str == "") return tokens;
      
      std::string currentToken;
      
      std::stringstream ss(str);
      
      while (std::getline(ss, currentToken, delim))
      {
        tokens.push_back(currentToken);
      }
      
      return tokens;
    }
    
    std::vector<std::string> splitString2(const std::string& str, char delim)
    {
      std::vector<std::string> tokens;
      
      if (str == "") return tokens;
      
      int leftIdx = 0;
      
      int delimIdx = str.find(delim);
      
      int rightIdx;
      
      while (delimIdx != std::string::npos)
      {
        rightIdx = delimIdx - 1;
        
        std::string token = getSubstring(str, leftIdx, rightIdx);
        tokens.push_back(token);
        
        // prep for next time around
        leftIdx = delimIdx + 1;
        
        delimIdx = str.find(delim, delimIdx + 1);
      }
      
      rightIdx = str.size() - 1;
      
      std::string token = getSubstring(str, leftIdx, rightIdx);
      tokens.push_back(token);
      
      return tokens;
    }
    
    std::string getSubstring(const std::string& str, int leftIdx, int rightIdx)
    {
      return str.substr(leftIdx, rightIdx - leftIdx + 1);
    }
    
    0 讨论(0)
  • 2020-11-22 00:11
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int split_count(string str,char delimit){
    return count(str.begin(),str.end(),delimit);
    }
    
    void split(string str,char delimit,string res[]){
    int a=0,i=0;
    while(a<str.size()){
    res[i]=str.substr(a,str.find(delimit));
    a+=res[i].size()+1;
    i++;
    }
    }
    
    int main(){
    
    string a="abc.xyz.mno.def";
    int x=split_count(a,'.')+1;
    string res[x];
    split(a,'.',res);
    
    for(int i=0;i<x;i++)
    cout<<res[i]<<endl;
      return 0;
    }
    

    P.S: Works only if the lengths of the strings after splitting are equal

    0 讨论(0)
提交回复
热议问题