【问题标题】:Issues parsing code using stringstream使用 stringstream 解析代码的问题
【发布时间】:2018-03-22 06:05:02
【问题描述】:

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

【问题讨论】:

  • 你的意思是它只解析到|"Foo and"|?我看不出您显示的代码有什么问题,除了第二次读取时没有错误检查。您的问题可能在readToken 内部吗?
  • @super 是的,我使用断点进行了调试,这就是发生的情况:代码解析带有空格的字符串没问题,比如“Foo and”,将其作为 stringToken 发送到 readToken 并且没问题,但是紧接着下一个传递 stringToken,while 循环内的字符串变量,是空的。并得到 readLine empty
  • @John 啊,好的。我知道问题是什么,发布一个答案。

标签: c++ parsing token stringstream


【解决方案1】:

当你这样做时

getline(ss, torzen, '"' );

stringToken += ' ' + torzen + '"';

您的 getline 将读取到下一个分隔符,在本例中为 "。这意味着在此提取之后,字符串[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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多