C++简单终端暂停函数的问题

inn6fuwd  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(117)

我在很多地方发现使用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”,程序就会继续。

sr4lhrrt

sr4lhrrt1#

有时候,一步一个脚印地做事情,完全靠自己,是最简单的解决办法:

void pause(std::string message) {
    std::cout << message;
    char c;
    while (std::cin.get(c) && c != '\n')
        ;
}

如果这里的目标是读取并丢弃std::cin上的所有内容,直到读取到一个换行符,那么您就应该这样做。当然,您可以尝试将手头的任务转储到ignore()上,但这些辅助库函数通常具有严格、不灵活的细微差别行为,有时它与程序的其余部分不匹配。并且所得到的变通方法只会使事情更加混乱。
一次读一个字符。读到换行符时停止。使命完成。

相关问题