在C ++中用定界符分割字符串

问题描述 投票:1回答:5

有一些有关此问题的示例。但是,大多数答案不是我想要的。

我正在寻找一种实现高效且简单功能的方法,而不是使用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数组,然后使用c作为定界符char数组的第一个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()部分继续。

因此,我想知道是否有任何方法可以实现一个有效且简单的功能,以便使用字符串定界符分割字符串?

c++ string split delimiter
5个回答
0
投票

通常来说,字符串是char指针。因此,您应该在分界线中搜索第一个字符,然后检查下一个字符。同样在查看您的代码时,我不确定(0!= * str ++)是否在执行您认为的操作。我认为您的意思是将其终止为null。


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;
}

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;
}

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;
}

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中。虽然,我不确定这段代码的效率。 :)

© www.soinside.com 2019 - 2024. All rights reserved.