sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-11-28 06:40:53 25 4
mua khóa gpt4 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;
phá vỡ;
}
s += d;
}
return s;
}

// other cases...
}

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

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

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

1 Câu trả lời

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

    while (true) // 1)

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

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

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

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

打印刚刚读取的字符

        if (d == '"')

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

        {
s += d;
(*input) >> std::skipws;
phá vỡ;
}
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/

25 4 0
Bài viết được đề xuất: c++ - 查找高于阈值的值非常慢
Bài viết được đề xuất: c++ - 将指向数组数组的指针传递给函数
Bài viết được đề xuất: C++ 嵌套 for 循环
Bài viết được đề xuất: c++ - 搜索链表是否为空
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com