次のコードで行入力を無効にしました:
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を押すと、プログラムが存在するときに次のようにクラッシュします。
実行時チェックの失敗#2-変数'cBuf'の周りのスタックが破損しました。
これによりスタックが破損するのはなぜですか?コードは単純なので、何が悪いのかわかりません。
問題を再現できる小さなプログラム:
#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を押すと、スタックが破損してクラッシュします。
また、毎回問題を再現することはできません。数回の試行が必要です。
新しい空のコンソールプロジェクトを作成し、そのコードを含むファイルを追加した後、VisualStudio2010で実行していました。