如何在清除屏幕之前等待键盘输入(getchar不工作)

时间:2016-08-14 04:54:46

标签: c++ linux

我正在尝试编写一个程序,在我清除屏幕并移动到下一个屏幕之前显示某些内容。我使用系统("清除")来清除屏幕。但我注意到它只是过快地清除了屏幕。我的意思是,即使我已经放了一个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 !!
}

2 个答案:

答案 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);,它会忽略所有字符,包括下一个换行符。

或者不清除屏幕,能够向后滚动并查看过去一直在做的事情是非常好的,清除屏幕会破坏它。

相关问题