简体   繁体   English

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

[英]How would I store an empty string into a vector

I am new to C++ and I am having trouble splitting a string by a delimiter and putting the substrings into a vector. 我是C ++的新手,无法用定界符分割字符串并将子字符串放入向量中。

My code is as follows: 我的代码如下:

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

a string and a delimiter are passed into the function and and performs the splitting. 将字符串和定界符传递到函数中并执行拆分。 This function is suppose to put empty strings into the vector but does not do it for me. 假定此函数将空字符串放入向量中,但对我而言不这样做。

for example if I call the function in main as: 例如,如果我在main中将函数调用为:

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

the output is suppose to be 输出应该是

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

minus the quotes 减去引号

but the output for my code currently is 但是我的代码的输出当前是

ab b    cd d  

any help would be appreciated. 任何帮助,将不胜感激。

This does the trick... 这样就可以了...

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

It seems your loop doesn't quite do the right thing: you walk character by character, advancing start by one during each iteration. 看来您的循环做得并不正确:您逐个字符地行走,在每次迭代中都start一个start前进。 I would suspect that you actually want to have a current position, find the next delimiter, add the string between the current position and the delimiter to the result, and make the current position the character after the delimiter: 我怀疑您实际上是想拥有一个当前位置,找到下一个定界符,将当前位置和定界符之间的字符串添加到结果中,并使当前位置成为定界符之后的字符:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM