使用stringstream解析代码的问题

时间:2018-03-22 06:05:03

标签: c++ parsing token stringstream

我的代码目前将名为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);
    }  
}

1 个答案:

答案 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;

坚持你已经拥有的东西,但要确保在让循环继续之前消耗空间。