我使用以下代码禁用了行输入:
DWORD dwConsoleMode;
GetConsoleMode(hStdIn, &dwConsoleMode);
dwConsoleMode ^= ENABLE_LINE_INPUT;
SetConsoleMode(hStdIn, dwConsoleMode);
然后我在循环中调用ReadConsole……在一个循环中:
wchar_t cBuf;
while (1) {
/* Display Options */
do {
ReadConsole(hStdIn, &cBuf, 1, &dwNumRead, NULL);
} while (!iswdigit(cBuf));
putwchar(cBuf);
if (cBuf == L'0') break;
}
如果我运行程序并立即按0键,则程序会干净地退出。
但是,如果我按一堆键,然后按0键,当程序退出时,它会崩溃并出现以下错误信息:
Run-Time Check Failure #2 - Stack around the variable 'cBuf' was corrupted.为什么会导致堆栈变得损坏?代码很简单,所以我想不出哪里出错了。 下面是可以重现该问题的小程序:
#include <windows.h>
#include <stdio.h>
int wmain(int argc, wchar_t *argv[])
{
DWORD dwNumRead;
wchar_t cBuf;
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
DWORD dwConsoleMode;
GetConsoleMode(hStdIn, &dwConsoleMode);
dwConsoleMode ^= ENABLE_LINE_INPUT;
SetConsoleMode(hStdIn, dwConsoleMode);
while (true)
{
wprintf(L"\nEnter option: ");
do {
ReadConsoleW(hStdIn, &cBuf, 1, &dwNumRead, NULL);
} while (!iswdigit(cBuf));
putwchar(cBuf);
if (cBuf == L'0') break;
}
return 0;
}
在运行程序后,您需要在按下0键之前猛击键盘,然后它会因栈损坏而崩溃。
我也不能每次都复现这个问题,需要尝试几次。
我是在Visual Studio 2010下运行的,创建了一个新的空控制台项目,并添加了包含该代码的文件。
ReadConsoleW
的返回值,并在必要时检查GetLastError
。否则,我一点头绪都没有! - Ken Y-NReadConsoleW
函数的返回值,但每次返回的数值都不为零,因此没有错误。另外当程序发生堆栈破坏时,调试器位于程序结尾处。 - Josh