在C++中拆分带有分隔符的字符串
Splitting a string with delimiter in C++
关于这个问题有几个例子。然而,大多数答案并不是我想要的。
我正在寻找一种实现高效简单函数的方法,而不是使用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()
部分继续。
所以我想知道是否有任何方法可以实现一个高效而简单的函数,用字符串分隔符来分割字符串?
一般来说,字符串是一个char指针。因此,您应该搜索delimeter中的第一个字符,然后检查下一个字符。此外,在查看您的代码时,我不确定while(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] != ' '; i++){
if(str[i] != d){
temp += str[i];
}else if(!empty(temp)){
vct.push_back(temp), temp.clear();
}
}
vct.push_back(temp);
return vct;
}
接受两个参数
- CCD_ 3作为分隔符
string str
作为要拆分的字符串
将分割后的字符串存储在CCD_ 5和CCD_。不过,我不确定这个代码的效率。:)
相关文章:
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 字符串开头的分隔符
- 尝试将 c 字符串数组与分隔符连接起来
- 根据新的行分隔符从字符串中删除子字符串
- 同一分隔符之间的多个子字符串
- 字符串流分隔符
- 使用正则表达式c++从单词和分隔符之间的字符串中提取所有子字符串
- C++获取两个分隔符之间的字符串并替换它
- 是否存在像C++中那样带有分隔符的C#原始字符串
- 如何从字符串开头到第二个分隔符中提取子字符串?
- 如何使用两个不同的分隔符拆分字符串
- 将子字符串提取到最后 n 个分隔符C++
- 基于 C++ 中的多个字符串分隔符拆分字符串
- 使用 boost::split 按分隔符的前 N 次匹配来拆分字符串
- 使用分隔符空格解析字符串,但字符串也包含空格
- 获取具有同一分隔符的多个实例的字符串的子字符串
- 具有两个分隔符的字符串流
- 子字符串和分隔符
- 将具有分隔符的字符串拆分为 3 个变量
- C++ 获取两个分隔符字符串之间的字符串