有一些有关此问题的示例。但是,大多数答案不是我想要的。
我正在寻找一种实现高效且简单功能的方法,而不是使用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()
部分继续。
因此,我想知道是否有任何方法可以实现一个有效且简单的功能,以便使用字符串定界符分割字符串?
通常来说,字符串是char指针。因此,您应该在分界线中搜索第一个字符,然后检查下一个字符。同样在查看您的代码时,我不确定(0!= * str ++)是否在执行您认为的操作。我认为您的意思是将其终止为null。
类似这样的事情应该做:
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;
}
这怎么样:
#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;
}
#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;
}
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
中。虽然,我不确定这段代码的效率。 :)