我正在尝试编写一个程序,在我清除屏幕并移动到下一个屏幕之前显示某些内容。我使用系统("清除")来清除屏幕。但我注意到它只是过快地清除了屏幕。我的意思是,即使我已经放了一个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 !!
}
答案 0 :(得分:3)
std::cin
从输入流中读取字符(通常为stdin
)。它在读取分隔符时停止,默认分隔符为\n
。
因此,当它读取序列时,流中仍有一个尾随换行符!
然后 getchar()
会读取\n
,然后返回。这就是没有停顿的原因。您必须从流中删除换行符:
std::cin.ignore(); //Discards 1 character from the stream
答案 1 :(得分:2)
getchar
“会起作用”,问题是在你的情况下,你正在阅读cin >> passwd;
留下的换行符。
解决此问题的正确方法是cin.ignore(1000, EOF);
,它会忽略所有字符,包括下一个换行符。
或者不清除屏幕,能够向后滚动并查看过去一直在做的事情是非常好的,清除屏幕会破坏它。