暂停功能,它永远循环

Pause Function it is Looping Forever

本文关键字:永远 循环 功能 暂停      更新时间:2023-10-16

我正在尝试在C++中实现暂停功能,但它永远循环。

我正在使用macOS,但我正在尝试创建一个可以在任何系统中工作的暂停功能...我相信我的 cin>>没有从键盘捕获""或"\r",而是永远循环播放。

void Transferencia::pause() {
char enter = 0;
while(enter != 'n' && enter != 'r') {
cout << "(Press Enter to Continue...) ";
cin >> enter;
}
cin.clear();
}

我想暂停我的程序,直到用户按下"回车"键。 但即使我按"输入/返回",它也会继续循环......

首先:enter != 'n' || enter != 'r'是一个重言式:即使enter等于其中一个字符,它也不能等于另一个字符。所以其中一个测试必须是真的...您实际上希望在enter不等于两个值时保持循环。

std::cin >> ...不会在按 Enter 之前读取数据,但它会丢弃换行符(实际上,所有空格(。因此,只需在没有循环的情况下正确读取一个字符就足够了(循环再次会得到一个无穷无尽的字符(;仅:如果用户在按"Enter"键之前根本没有输入任何内容,则没有字符可以从std::cin中读取,我们仍在等待。

您可以做的是阅读整行:

std::string s;
std::getline(std::cin, s);

这也将接受空行,所以完全可以接受你想要的(注意:没有循环!

编辑(从评论中窃取;谢谢,托马斯·马修斯(:一种更优雅的方式是

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');

因为它不会创建任何额外的资源,这些资源无论如何都会被丢弃(std::string对象!

编辑 2:

根据上次输入操作的类型,可能仍然缓冲了一个换行符(甚至更多数据(,例如在int n; std::cin >> n;之后。在这种情况下,您需要跳过尚未缓冲的输入。因此,您需要忽略两次。

但是,如果最后一个输入操作已经消耗了换行符(例如std::getline– 或者如果之前根本没有任何输入操作(,那么这将导致用户必须按两次 Enter 键。所以你需要检测以前发生了什么。

std::cin.rdbuf().in_avail()允许您检测有多少字符已缓冲。因此,您可以拥有:

if(std::cin.rdbuf().in_avail())
{
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
}
std::cout << "press enter" << std::endl;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');

但是,在某些系统(包括我的系统(上,即使尚未缓冲换行符,in_avail也可以返回 0!std::cin.sync_with_stdio(false);可以解决问题;您应该在第一次输入操作之前执行它。希望您不要使用C++(流(和 C(scanfprintf等(IO 混合然后......

最简单的方法是使用getline()

cin >>忽略空格,包括换行符。getline()将读取整行,包括换行符。但是,它不会将换行符复制到输出字符串。如果用户只是按回车键而不是其他任何键,你最终会得到一个空字符串。

因此,为了获得所需的行为,您可以像这样构建循环:

string line;
while(true)
{
cout << "(Press Enter to Continue...) " << endl;
getline(cin, line);
if(line == "")
break;
}

@Aconcagua已经回答了你的问题,但这就是我想补充的。

通常,为了处理计算机中的某种特定类型的事件,我们通常遵循event-driven范式或event-callback。 这个想法是有一个事件循环,等待新事件进入系统。在这种情况下,键盘是一个事件,事件循环然后调用event-callbackevent-callback所做的是将输入的值与某些条件进行比较,然后执行其他一些任务(它可能会更改程序的某些状态或通知用户(。

这个想法是通过两种方式保持 CPU 忙碌。

  1. event-driven:在等待新事件时执行其他任务
  2. multithreading:系统中有多个线程。这种方法的缺点是data-race

玩得愉快