C ++字符串解析器问题

时间:2017-10-04 21:10:56

标签: c++ string parsing stdstring

好的,所以我正在用C ++编写一个家庭作业项目并且遇到了一个问题,而且似乎无法找到解决方法。该函数应该在用户定义的分隔符处中断输入字符串,并将子字符串存储在稍后要访问的向量中。我想我已经找到了基本的解析器,但它并不想分割输入的最后部分。

int main() {
    string input =  "comma-delim-delim&delim-delim";
    vector<string> result;
    vector<char> delims;
    delims.push_back('-');
    delims.push_back('&');
    int begin = 0;

    for (int i = begin; i < input.length(); i++ ){
       for(int j = 0; j < delims.size(); j++){
          if(input.at(i) == delims.at(j)){
           //Compares chars in delim vector to current char in string, and 
           //creates a substring from the beginning to the current position 
           //minus 1, to account for the current char being a delimiter.
              string subString = input.substr(begin, (i - begin));
              result.push_back(subString);
              begin = i + 1;
           }

以上代码适用于将输入代码分割到最后一个破折号。之后的任何事情,因为它没有遇到另一个分隔符,它不会保存为子字符串并推入结果向量。因此,为了纠正这个问题,我将以下内容放在一起:

else if(input.at(i) == input.at(input.length())){
   string subString = input.substr(begin, (input.length() - begin));
   result.push_back(subString);
}

但是,我继续使用上述部分超出界限错误。它似乎存在分裂子串的边界问题,我无法弄清楚如何绕过它。有什么帮助吗?

3 个答案:

答案 0 :(得分:1)

在你的代码中,你必须记住.size()将比你的上一个索引多1,因为它从0开始。所以大小为1的数组被索引为[0]。所以如果你做input.at(input.length())将总是溢出1位。 input.at(input.length() - 1)是最后一个元素。这是一个适合我的例子。你的循环之后只需抓住最后一段字符串。

if(begin != input.length()){
    string subString = input.substr(begin,(input.length()-begin));
    result.push_back(subString);
}

答案 1 :(得分:0)

使用问题中的代码来替换迭代器,以便我们检查输入的end()

int main() {
    string input = "comma-delim-delim&delim-delim";
    vector<string> result;
    vector<char> delims;
    delims.push_back('-');
    delims.push_back('&');
    auto begin = input.begin(); // use iterator

    for(auto ii = input.begin(); ii <= input.end(); ii++){
        for(auto j : delims) {
            if(ii == input.end() || *ii == j){
                string subString(begin,ii); // can construct string from iterators, of if ii is at end
                result.push_back(subString);
                if(ii != input.end())
                    begin = ii + 1;
                else
                    goto done;
            }
        }
    }
done:
    return 0;
}

答案 2 :(得分:0)

此程序使用std::find_first_of来解析多个分隔符:

int main() {
    string input = "comma-delim-delim&delim-delim";
    vector<string> result;
    vector<char> delims;
    delims.push_back('-');
    delims.push_back('&');
    auto begin = input.begin(); // use iterator

    for(;;) {
        auto next = find_first_of(begin, input.end(), delims.begin(), delims.end());
        string subString(begin, next); // can construct string from iterators
        result.push_back(subString);
        if(next == input.end())
            break;
        begin = next + 1;
    }
}