我在很多地方发现使用system("pause")
是一个坏习惯。所以我创建了一个函数来代替它。经过一番研究,我得出了以下函数:
void pause(std::string message) {
std::cout << message;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
std::cin.get();
}
当我测试它时,它工作得很完美,消息出现(std::cout << message
),当我按回车键时暂停并继续。
当我使用了不止一个暂停时,问题就开始了,在第二次使用pause()
或第三次使用pause()
后,我需要按回车键不止一次,第一次只是跳过一行,然后第二次执行该函数。我读过关于清除缓冲区的文章,但我发现所有的东西都落在了该行上:std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
已经出现在代码中。至于其余的代码,我相信它不会干扰,因为如果我创建一个程序,只有这些功能,例如:
pause();
pause();
pause();
它的行为相同,需要多次输入。
我正在使用Microsoft Visual Studio 2022。
我尝试了几件事,包括删除行std::cin.ignore()
,但这意味着当我有一些其他的std::cin
,如要求用户选择,并在有一个暂停后,它自动运行,我相信,因为缓冲区...pause()
函数的正确工作方式是,每次调用它时,只需按一次“enter”,程序就会继续。
1条答案
按热度按时间sr4lhrrt1#
有时候,一步一个脚印地做事情,完全靠自己,是最简单的解决办法:
如果这里的目标是读取并丢弃
std::cin
上的所有内容,直到读取到一个换行符,那么您就应该这样做。当然,您可以尝试将手头的任务转储到ignore()
上,但这些辅助库函数通常具有严格、不灵活的细微差别行为,有时它与程序的其余部分不匹配。并且所得到的变通方法只会使事情更加混乱。一次读一个字符。读到换行符时停止。使命完成。