暂停功能,它永远循环
Pause Function it is Looping Forever
我正在尝试在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(scanf
、printf
等(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-callback
。event-callback
所做的是将输入的值与某些条件进行比较,然后执行其他一些任务(它可能会更改程序的某些状态或通知用户(。
这个想法是通过两种方式保持 CPU 忙碌。
event-driven
:在等待新事件时执行其他任务multithreading
:系统中有多个线程。这种方法的缺点是data-race
玩得愉快
- 密码登录程序将永远循环并显示不正确的结果
- 为什么我的 while 循环永远不会在 C++ 中的数字猜测游戏中结束?
- curl_slist->next 永远不会为空,因此当循环卡住时
- 暂停功能,它永远循环
- 而循环永远持续(C++)
- C++ 永远循环
- 更好的做法:永远循环线程或连续线程
- 永远循环..未正确清除用户输入
- 因为循环永远存在
- 永远循环的链接列表破坏者
- 永远不会达到 EOF(无限循环)
- 未定义的行为怪癖:在缓冲区外读取导致循环永远不会终止
- 如何使程序永远循环,直到满足 switch 语句中的特定情况
- 我的程序一直在循环,永远不会"return 0;".是编译器不好还是代码不好?
- Pthread 循环函数永远不会被调用
- While永远循环
- 数据包在libnetfilter_queue中永远循环
- 当给定一个字符串时,为什么while会永远循环
- 创建一个 for(永远)循环。系统不想启动
- 我的程序永远循环,只做我告诉它要做的一半