C ++字符串拆分分割错误

时间:2012-05-28 19:32:08

标签: c++ string split end-of-line

我将字符串拆分为字符串向量

    vector<string> tokens;

    stringstream strstm(str);
    string item;
    while (getline(strstm, item, ' ')) {
        tokens.push_back(item);
    }

    token_idx = 0;

    cout << "size = " << tokens.size() << endl;

    for (unsigned int i = 0; i < tokens.size(); i++)
    {
        cout << tokens[i] << "[" << i << "]" << endl;
    } 

拆分成功,size()及其元素是我喜欢的。然而,当我试图获得它的价值时,最后一个标记似乎很奇怪。

string Lexer::consume() {
    if (hasValue()) {
        token_idx++;
        cout << "consumed " << tokens[token_idx-1] << " tokens = " << token_idx -1 << endl;
        return tokens[token_idx-1];
    }
    cout << "didn't consume, token_idx = " << token_idx << endl;
    return "null";
}

hasVal就像这样

bool Lexer::hasValue() {
    if ( token_idx < tokens.size()) {
        return true;
    } else {
        return false;
    }
}

如果我有一个类似1 + 2 * 3的输入字符串,我的程序的预期输出应为(+1(*23)),但是我收到了分段错误。

size = 5
1[0]
+[1]
2[2]
*[3]
3[4]
consumed 1 tokens = 0
consumed + tokens = 1
consumed 2 tokens = 2
consumed * tokens = 3
consumed 3 tokens = 4
Segmentation fault (core dumped)

但如果我将有值检查更改为( token_idx < tokens.size() -1 ),程序将返回(+1 (*2 null))

size = 5
1[0]
+[1]
2[2]
*[3]
3[4]
consumed 1 tokens = 0
consumed + tokens = 1
consumed 2 tokens = 2
consumed * tokens = 3
didn't consume, token_idx = 4
(+1 (*2 null))

所以我想知道在分裂我的方式之后是否有3行结束或是否有其他因素导致这种行为?我很确定我不会超出矢量范围。

1 个答案:

答案 0 :(得分:1)

我认为产生错误的真正有罪的代码并没有向她展示,但是因为我能感觉到你操纵indice的方式......你在令牌列表的末尾访问结束时没有错误的错误除了容易出错的设计,这就是全部。

if (hasValue()) { // has value is useless to me
    token_idx++;  // why incrementing this here ?

    cout << "consumed " << tokens[token_idx-1] << " tokens = " << token_idx -1 << endl;

    return tokens[token_idx-1];
}

将其更改为:

if ( token_idx < tokens.size() ) { 
    cout << "consumed " << tokens[token_idx] << " tokens = " << token_idx << endl;

    return tokens [ token_idx++ ];
}

另请阅读recursive descent parsing,这非常简单,您将更加了解解析,避免常见的陷阱。