cin.ignore().get()导致程序卡在输入,如何正确实现?
问题:
enter_to_continue()函数无法正常响应回车输入? 你使用的这段代码实现并不正确,会因为输入缓冲区的残留字符导致无法正常等待用户输入回车:
void enter_to_continue() { cout << "Press enter to continue..."; cin.ignore().get(); }
问题原因
cin.ignore()默认只忽略1个字符,如果之前的输入操作(比如cin >>读取变量)后,输入缓冲区里残留了未处理的字符(比如用户输入数据后按下的换行符,或者多余的输入内容),ignore()只会清除其中一个字符,剩余的字符会被后续的cin.get()直接读取,导致get()不会阻塞等待用户按下回车。
正确实现方式
需要先清空输入缓冲区中所有残留的字符,直到遇到换行符(包括换行符本身),再调用cin.get()等待用户输入。注意需要包含<limits>头文件来使用numeric_limits:
#include <iostream> #include <limits> void enter_to_continue() { std::cout << "Press enter to continue..."; // 忽略缓冲区中所有字符,直到遇到换行符(包含换行符) std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cin.get(); }
如果不想引入<limits>头文件,也可以用一个足够大的数值替代numeric_limits<std::streamsize>::max(),比如1024,但前者是更标准的写法。
另外,如果你确认输入缓冲区中没有残留字符,也可以直接使用std::cin.get(),但这种情况很少见,尤其是在有其他输入操作的程序中。
内容的提问来源于stack exchange,提问作者SanguineL
相关产品推荐
相关产品推荐

