在C ++中使用分隔符拆分字符串

时间:2013-07-12 15:25:56

标签: c++ string split delimiter

有一些关于这个问题的例子。然而,大部分答案都不是我想要的。

我正在寻找一种方法来实现高效简单的功能,而不是使用boost或任何其他非STL库。如果你问我为什么,在大多数编码比赛和采访中,你都不被允许使用它们。

这是我能接近的最接近的地方:

vector<string> SplitString(const char *str, char c)
{
    vector<string> result;
    do {
        const char *begin = str;
        while(*str != c && *str) {
            str++;
        }
        result.push_back(string(begin, str));
    } while (0 != *str++);
    return result;
}

int main() {

    string mainString = "This is a sentence. Another sentence. The third sentence. This is the last sentence.";
    vector<string> sentences;
    sentences = SplitString(mainString.c_str(), '.');
    while (!sentences.empty()) {
        cout << sentences.back() << endl;
        sentences.pop_back();
    }
    return 0;
}

现在问题是,它只能有一个char分隔符而不是字符串。我想过实施一些方法,但它们看起来太复杂了。我认为最容易的是,将分隔符转换为char数组后使用c作为分隔符char数组的第一个字符:

while(*str != c && *str) {
    str++;
}
const char *beginDelim = *cArr;
while(1) {
    if (*str == *cArr && *str && *cArr) {
       str++;
       cArr++;
    }
    else if (!*cArr) {
        break;
    }
    else if (*cArr) {
        cArr = beginDelim;
    }
}

代码从result.push_back()部分继续。

所以我想知道是否有任何方法可以实现一个有效且简单的函数来分割带字符串分隔符的字符串?

5 个答案:

答案 0 :(得分:0)

一般来说,字符串是char指针。因此,您应该搜索分隔符中的第一个字符,然后检查下一个字符。另外,在查看代码时,我不确定while(0!= * str ++)是否按照您的想法进行操作。我认为你的意思是它被终止。

答案 1 :(得分:0)

这样的事情应该这样做:

vector<string> SplitString(const char* str,const char* d) {
  vector<string> result;
  size_t len = strlen(d);
  const char* start = str;
  while ( str = strstr(start,d) ) {
    result.push_back(string(start,len));
    start = str + len;
  }
  result.push_back(start);
  return result;
}

答案 2 :(得分:0)

这是怎么回事:

#include <vector>
#include <algorithm>
#include <string>

using namespace std;

vector<string> SplitString(const string &str, const string &delim)
{
    vector<string> ret;
    string::const_iterator prev = str.begin();

    for (string::const_iterator i = str.begin(); i < str.end() - delim.length()+1; ++i)
    {
        if (equal(delim.begin(), delim.end(), i)) {
            ret.push_back(string(prev,i));
            i += delim.length()-1;
            prev = i+1;
        }
    }

    ret.push_back(string(prev,str.end()));

    return ret;
}

答案 3 :(得分:0)

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<string> SplitString(string str, const string &delim) {
    vector<string> result;
    size_t found;
    while((found = str.find(delim)) != string::npos) {
        result.push_back(str.substr(0, found));
        str = str.substr(found + delim.size());
    }
    return result;
}

int main() {
    string mainString = "This is a sentence. Another sentence. The third sentence. This is the last sentence.";
    vector<string> sentences;

    sentences = SplitString(mainString, ".");

    for(auto& sentence : sentences) {
        cout << sentence << endl;   
    }
    return 0;
}

答案 4 :(得分:0)

vector<string>split(string str, const char d){
    string temp;
    vector<string>vct;
    for(int i = 0; str[i] != '\0'; i++){
        if(str[i] != d){
            temp += str[i];
        }else if(!empty(temp)){
                vct.push_back(temp), temp.clear();
        }
    }
    vct.push_back(temp);
    return vct;
}

接受两个参数

  • const char d作为分隔符。
  • string str作为要分割的字符串。

将分割后的字符串存储在vector中,并returns中。 虽然,我不确定这段代码的效率。 :)