如何在清除屏幕之前等待键盘输入(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 !! 
} 
+0

为什么不使用内联?宏不是一个好的工具 –

std::cin读取来自输入流(通常stdin)字符。它在读取分隔符时停止,默认分隔符为\n

因此,当它读取一个序列时,仍然存在尾随的换行符

getchar()然后会读取\n并返回。这就是为什么没有停顿。你必须从流中删除换行符:

std::cin.ignore(); //Discards 1 character from the stream 

getchar“将工作”,问题是,你的情况,你正在阅读的新行留下cin >> passwd;

解决此问题的适当方法是cin.ignore(1000, EOF);,它将忽略直到并包括下一个换行符的所有字符。

或者不清除屏幕,能够回滚并查看过去一直在做什么以及清除屏幕会非常好。