我正在将一个字符串拆分为一个字符串向量
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)
但是如果我将 has value check 更改为( 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 之后有行尾,或者是否有其他因素导致这种行为?我很确定我不会超出向量的范围。