我以前真的有这个问题。首先,你不应该在控制台中使用混合输入(例如“stdio.h”和“conio.h”和“iostream”和“windows”)。在你的情况我会去的Windows控制台(MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073(v=vs.85).aspx) 但正如你可能会想,我是个懒人过了,我做了一个解决办法,下面的代码:
void ClearConsoleInputBuffer()
{
// If you happen to have any trouble clearing already cleared buffer, uncomment the section below.
/* keybd_event('S', 0, 0, 0);
keybd_event('S', 0,KEYEVENTF_KEYUP, 0);
keybd_event(VK_BACK, 0, 0, 0);
keybd_event(VK_BACK, 0,KEYEVENTF_KEYUP, 0); */
PINPUT_RECORD ClearingVar1 = new INPUT_RECORD[256];
DWORD ClearingVar2;
ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),ClearingVar1,256,&ClearingVar2);
delete[] ClearingVar1;
}
现在,它做什么?当您在控制台中键入字符时,它们全部存储在控制台缓冲区中。当你编写cin >> variable;
时,你实际上不是直接从用户获取字符,而是从缓冲区获取字符。 让我给你举个例子:
#include "windows.h"
#include "iostream"
using namespace std;
int main()
{
cout << "write something";
Sleep(10000);
int input;
cin >> input;
}
你会发现,当你输入的字符,即使没有cin
叫,你保存按键顺序。
现在想象一下当你按下按键而没有用'cin'处理它们时会发生什么。他们会留在缓冲区。你应该避免这种情况。但是,您可以使用我上面提到的代码在启动之前清除控制台缓冲区(示例如下):
#include "windows.h"
#include "iostream"
using namespace std;
void ClearConsoleInputBuffer()
{
PINPUT_RECORD ClearingVar1 = new INPUT_RECORD[256];
DWORD ClearingVar2;
ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),ClearingVar1,256,&ClearingVar2);
delete[] ClearingVar1;
}
int main()
{
cout << "write something";
Sleep(3000);
ClearConsoleInputBuffer();
int a;
cin >> a;
}
您想完成什么? –
这是一个简单的计数器。当我按1.它简单地添加到一个整数+1。当2到另一个整数。如:1.呼叫2.已回答 –
这些功能用于GUI应用程序。当您从Windows队列中获取键盘输入消息时,您可以调用GetKeyState。他们不与iostreams混合。 –