我的代码目前将名为aLine
的用户输入字符串解析为不同的标记。目前,如果我输入我输入x = "Foo" .add. "Bar"
令牌被解析为|x| |=| |"Foo"| |.add.| |"Bar"|
,这是完美的。但是,如果我尝试执行以下x = "Foo and" .add. "Bar"
它只会解析|"Foo and Bar"|
,然后代码进入无限循环。为什么会这样?
void splitLine(string aLine) {
stringstream ss(aLine);
string stringToken, outp;
char delim = ' ';
while (getline(ss, stringToken, delim)) { // Break line into tokens and store them in rTokenBag
if (stringToken[0] == '"' && stringToken[stringToken.size() - 1] != '"' ) {
string torzen;
getline(ss, torzen, '"' );
stringToken += ' ' + torzen + '"';
}
Token t(readToken(stringToken)); // assing value of stringToken parsed to t, this labes invalid tokens
R_Tokens.push_back(t);
}
}
答案 0 :(得分:0)
当你这样做时
getline(ss, torzen, '"' );
stringToken += ' ' + torzen + '"';
您的getline将读取下一个分隔符,在本例中为"
。这意味着在此exrtaction之后,字符串[x = "Foo and" .add. "Bar"]
的左边是[ .add. "Bar"]
,请注意开头的空白区域。由于您将"
指定为分隔符,因此未占用空间。
这意味着下次拨打getline(ss, stringToken, delim)
时,会发现' '
为第一个字符并立即停止。
如果您不是更改分隔符,而是手动附加"
,只需再次使用空格作为分隔符getline
。
getline(ss, torzen, delim); // space as delimiter again
stringToken += ' ' + torzen; // torzen = and" so no need to add the "
现在,您的下一次迭代应按预期工作并获得.add.
- 编辑 -
我刚刚意识到你改变了分隔符,因为你想读取整个字符串,即使它中有多个空格。
在这种情况下,您只需要在操作后转储空间,这样就可以了
getline(ss, torzen, '"' );
stringToken += ' ' + torzen + '"';
char dump;
ss >> dump;
坚持你已经拥有的东西,但要确保在让循环继续之前消耗空间。