如何将空字符串存储到向量中

How would I store an empty string into a vector

本文关键字:向量 存储 字符串      更新时间:2023-10-16

我是C++的新手,在用分隔符分割字符串和将子字符串放入向量时遇到了问题。

我的代码如下:

vector<string> split(const string &s, const string &delim)
{   
    string::size_type pos = s.find_first_of(delim,0);
    int start = 0;
    vector<string> tokens;
    while(start < s.size())
    {
            if(start++ != pos + 1)
                    tokens.push_back(" ");
            pos = s.find_first_of(delim, start);
            tokens.push_back(s.substr(start, pos - start));
    }
    for(vector<string>::size_type i = 0; i != tokens.size(); ++i)
            cout << tokens[i];
    return tokens;
}

字符串和分隔符被传递到函数中,并执行拆分。这个函数被假设为将空字符串放入向量中,但对我来说并没有这样做

例如,如果我调用main中的函数为:

int main()
{
   split("<ab><>cd<", "<>");
}

假设输出是

"","ab","","","","cd",""

减去报价

但我的代码目前的输出是

ab b    cd d  

任何帮助都将不胜感激。

这就成功了。。。

#include <iostream>
#include <vector>
using namespace std;
vector<string> split(string record, string token) {
    vector<string> results;
    size_t startPos = 0;
    size_t pos = 0;
    // Step: If either argument is empty then return
    // an empty vector.
    if (record.length() == 0 || token.length() == 0) {
        return results;
    }
    // Step: Go through the record and split up the data.
    while(startPos < record.length()) {
        pos = record.find(token, startPos);
        if (pos == string::npos) {
            break;
        }
        results.push_back(record.substr(startPos, pos - startPos));
        startPos = pos + token.length();
    }
    // Step: Get the last (or only bit).
    results.push_back(record.substr(startPos, record.length() - startPos));
    // Step: Return the results of the split.
    return results;
}
void printData(vector<string> list) {
    for(vector<string>::iterator it = list.begin(); it < list.end(); it++) {
        cout << *it << endl;
    }
}
int main(int argc, char** argv) {
    string record = "";
    string delim = "";
    if (argc == 3) {
        record = argv[1];
        delim = argv[2];
        printData(split(record,delim));
    } else {
        string record = "comma,delimited,data";
        string delim = ",";
        printData(split(record,delim));
        record = "One<--->Two<--->Three<--->Four";
        delim = "<--->";
        printData(split(record,delim));
    }
}

循环似乎没有做正确的事情:一个字符接一个字符地遍历,在每次迭代中逐个推进start。我怀疑您实际上想要一个当前位置,找到下一个分隔符,将当前位置和分隔符之间的字符串添加到结果中,并使当前位置成为分隔符之后的字符:

for (std::string::size_type start(0); start != s.npos; )
{
    std::string::size_type end(s.find_first_of(delim, start));
    tokens.push_back(s.substr(start, end != s.npos? end - start: end));
    start = end != s.npos? end + 1: s.npos;
}