1

关于这个问题有几个例子。然而,大多数答案都不是我想要的。

我正在寻找一种方法来实现高效且简单的功能,而不是使用 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;
}

现在的问题是,它只能有一个字符分隔符而不是字符串。我曾想过实施几种方法,但它们似乎太复杂了。我认为最简单的方法是,将分隔符转换为字符数组c,用作分隔符字符数组的第一个字符:

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()部分继续。

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

4

5 回答 5

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;
}
于 2014-03-28T16:00:21.787 回答
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;
}
于 2013-07-12T16:03:53.193 回答
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;
}
于 2013-07-12T15:55:32.077 回答
0

一般来说,字符串是一个字符指针。因此,您应该搜索分隔符中的第一个字符,然后检查下一个字符。同样在查看您的代码时,我不确定 while (0 != *str++) 是否在做您认为的事情。我认为你的意思是它被空终止。

于 2013-07-12T15:36:44.357 回答
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作为要拆分的字符串。

将拆分后的字符串存储在 avectorreturns它中。虽然,我不确定这段代码的效率。:)

于 2020-02-23T06:33:13.753 回答