如何在清除屏幕之前等待键盘输入(getchar不起作用)
问题描述:
我正在尝试编写一个程序,其中我正在显示某些内容,然后清除屏幕并移至下一个屏幕。我正在使用系统(“清除”)清除屏幕。但我注意到它只是以太快的速度清除屏幕。我的意思是,即使我已经放了一个getchar(),它只是不等待键盘输入并执行下一个命令。我无法弄清楚为什么!如何在清除屏幕之前等待键盘输入(getchar不起作用)
这是我为这应该等待击键暂停宏代码:
#define pause() \
do{ \
cout<<"Press any key to continue";\
getchar();\
} while(0);
下面是它使用上面的宏代码,但下面的代码不会等待被按下的键在清除屏幕之前!
void registerUser()
{
string uid,passwd;
cout <<"Enter UID: ";
cin >> uid;
cout<<" Enter Password: ";
cin>>passwd;
bool ret = addUser(uid,passwd);
if (ret == false)
{
cout<<"User "<< uid <<" already exists\n"; // This message is not displayed
}
else
{
cout<<"User " << uid <<" Successfully added\n"; // This message is not displayed
}
pause(); // Program does not wait here as expected
system("clear"); // Screen is cleared immediately !!
}
答
std::cin
读取来自输入流(通常stdin
)字符。它在读取分隔符时停止,默认分隔符为\n
。
因此,当它读取一个序列时,仍然存在尾随的换行符!
getchar()
然后会读取\n
并返回。这就是为什么没有停顿。你必须从流中删除换行符:
std::cin.ignore(); //Discards 1 character from the stream
答
getchar
“将工作”,问题是,你的情况,你正在阅读的新行留下cin >> passwd;
。
解决此问题的适当方法是cin.ignore(1000, EOF);
,它将忽略直到并包括下一个换行符的所有字符。
或者不清除屏幕,能够回滚并查看过去一直在做什么以及清除屏幕会非常好。
为什么不使用内联?宏不是一个好的工具 –