C++字符串拆段错误

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

我正在将一个字符串拆分为一个字符串 vector

    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 之后是否有行尾,或者是否有其他一些因素导致了这种行为?不过,我很确定我不会越界。

最佳答案

我认为产生错误的真正有罪的代码没有显示给她,但因为我能感觉到你操纵指数的方式......没有神秘的是你在访问 token 列表的末尾时出错,在除了容易出错的设计,仅此而已。

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 , 它真的很简单,你会更了解解析,避免常见的陷阱。

关于C++字符串拆段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10789603/

相关文章:

c++ - std::unordered_set::find 和 std::find 之间奇怪的性能差异

c++ - 在一个 C++ 文件中运行多个 execve 函数

javascript - 为什么我的分割字符串仅使用 JavaScript 就输出多次?

ios - 从 Core Data Swift 中检索字符串

c++ - 唯一形式算法和列表容器的唯一有什么区别?

分配 const char* const 缓冲区时,C++ 应用程序崩溃

javascript - VueJS 打印 HTML 到页面

string - 为什么 strings.HasPrefix 比 bytes.HasPrefix 快?

algorithm - 查找字符串中第一个未重复的字符

java - 为什么键盘给出的循环迭代范围将自身算作一次迭代?