最近几天我一直在学习C++(几年前我只上过一些CS课程)。我目前正在阅读和学习《C++ Primer》第五版,我遇到了这个问题,我不确定它与代码本身或 Microsoft Visual Studio 2022 有关...
据我目前所知,我了解此代码背后的所有原理,并且我设法使用 Microsoft Visual Studio 2022 编写了类似的代码:
#include <iostream>
int main()
{
int currVal = 0, nextVal = 0;
std::cout << "Write a series of numbers: " << std::endl;
int i = 1;
if (std::cin >> currVal)
{
while (std::cin >> nextVal)
{
if (nextVal == currVal)
++i;
else
{
std::cout << currVal << " occurs " << i << " times" << std::endl;
currVal = nextVal;
i = 1;
}
}
std::cout << currVal << " occurs " << i << " times" << std::endl;
}
return 0;
}
但是,当我运行程序并引入书中给出的序列 - 42 42 42 42 42 55 55 62 100 100 100 - 我的程序停止并且不会继续计算数字 100,如下图所示:
这是我的代码或编译器的问题吗?
提前感谢您的帮助! :D
我还尝试复制并粘贴书中的代码,编译器也做了同样的事情。我想这一定是程序无法识别行尾的问题...我尝试了 ChatGPT 给出的一些解决方案,例如在 while 循环中添加
!std::cin.eof()
或使用 std::cin.clear(); td::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
清除输入缓冲区代码结束了,它仍然不起作用......
这是我的代码或编译器的问题吗?
都不是。输入是行缓冲的,因此您需要按 Enter 键让程序开始处理您输入的内容。一旦它处理完您输入的数字,它就会在
处等待新的输入while (std::cin >> nextVal)
在当前形式下,为了终止程序,您可以通过按 CTRL-Z (Windows) / CTRL-D (*nix) 关闭输入流。这将导致
std::cin >> nextVal
中的提取失败并使 std::cin
处于失败状态。 std::cin
可以通过其成员函数 bool
转换为
operator bool() const
,如果 false
处于失败状态,它将返回 std::cin
,如果没有错误,则返回 true
。