2014-09-04 76 views
0

我有一个小型控制台应用程序需要用户输入,我有以下循环连续询问用户输入,直到他们(a)输入他们的名称并按回车或(b)按下转义键。出于某种原因,当他们按下退出键时,他们必须按回车键,那时只有循环结束,控制台窗口仍然保持打开,我错过了什么?代码如下...C++控制台不按预期方式退出

while (input.empty()) { 

    cout << "Enter Something"; 

    getline(cin, input); 

    if (GetAsyncKeyState(VK_ESCAPE)) 
    { 
     exit(EXIT_SUCCESS); // this should just close the console entirely, right? 
    } 

} 
+0

'getline'块等待输入。如果你想异步处理输入,你需要使用不同的方法。 – 2014-09-04 04:40:58

+0

如果我没有弄错'std :: getline()'会在等待输入时阻塞,所以'GetAsynKeyState()'在读取输入时永远不会运行。 – 0x499602D2 2014-09-04 04:41:53

回答

2

GetAsyncKeyState调用getline后调用。 getline等待用户键入一些数据并按下回车键(或者等待一行以换行符结束的数据从标准输入读取)。只有在getline完成后,此代码才会检查ESC键是否被按下。

看到这个问题的一种方式,做你要完成的任务:How to read until ESC button is pressed from cin in C++

0

我认为把前面的getline()如果测试不允许后者执行,因为前者导致阻塞I/O。试试这个:

while (input.empty()) { 
    cout << "Enter Something"; 
    if (GetAsyncKeyState(VK_ESCAPE)) { 
     exit(EXIT_SUCCESS);   
    } 
    getline(cin, input); 
} 
+0

除非您在看到消息之前已经按下了转义,否则这是同一个问题。 – 2014-09-04 04:50:55