gpt4 book ai didi

c++ - istream 末尾的字符问题

转载 作者:行者123 更新时间:2023-11-28 06:40:53 24 4
gpt4 key购买 nike

我正在编写一个解析器,之前我在尝试解析标识符(任何对 C++ 变量名有效的东西)和未闭合的字符串文字(任何以 " 开头的东西)时遇到了麻烦,但是在我的输入末尾缺少结束符 ")。我认为这是因为词法分析器 (TokenStream) 在这些情况下使用 std::noskipws 并逐个字符地构建 token 。这是我认为我已经缩小了问题范围的地方(仅针对两种情况之一显示,因为另一种情况的逻辑非常相似):

std::string TokenStream::get()
{
char c;
(*input) >> c; // input is of type istream*

// other cases...

if (c == '"')
{
std::string s = stringFromChar(c); // just makes a string from the char.
char d;
while (true) // 1)
{
(*input) >> std::noskipws >> d;
std::cout << d; // 2)
if (d == '"')
{
s += d;
(*input) >> std::skipws;
break;
}
s += d;
}
return s;
}

// other cases...
}

请注意,此函数应该只是以类似流的方式从输入中生成标记。现在,如果我输入文字(如 asdf)或未闭合的字符串(如 "asdf),程序将挂起,标记为 2 的行) 将永远一遍又一遍地输出输入的最后一个字符(在我的示例中,f)。

我已经通过检查 input->eof() 解决了这个问题,但我的问题是:

为什么循环(在注释中标记为 1))在我到达流末尾时继续执行,为什么每次循环都只打印最后读取的字符?

最佳答案

让我们逐行查看有问题的循环

    while (true) // 1)

除非遇到中断,否则会循环

    {
(*input) >> std::noskipws >> d;

读取一个字符。如果不能读出字符,d可能是不变的。

        std::cout << d; // 2)

打印刚刚读取的字符

        if (d == '"')

不,最后一个字符不是"(如问题中所指定)

        {
s += d;
(*input) >> std::skipws;
break;
}
s += d;
}

因此永远不会遇到中断,最后一个字符将无限循环打印。


修复:总是使用 while 看起来像这样的输入:

char ch;
while (input >> ch) {

// ch contains a new letter, deal with it

}

关于c++ - istream 末尾的字符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25985383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com