मैं निम्नलिखित कोड के साथ विकलांग लाइन इनपुट की गई:स्टैक को दूषित करने वाले लूप में ReadConsole क्यों कॉल कर रहा है?
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 दबाते हैं, और यह ढेर भ्रष्टाचार के साथ दुर्घटनाओं।
मैं भी हर बार समस्या का पुनरुत्पादन नहीं कर सकता, इसमें कुछ प्रयास लगते हैं।
मैं एक नया खाली कंसोल प्रोजेक्ट बनाने और उस कोड के साथ एक फाइल जोड़ने के बाद, विजुअल स्टूडियो 2010 के तहत इसे चला रहा था।
मैं समस्या को पुन: पेश नहीं कर सकता। क्या आप इस मुद्दे को प्रदर्शित करने के लिए एक छोटा लेकिन पूरा कार्यक्रम पोस्ट कर सकते हैं? –
मैं 'ReadConsoleW' के वापसी मूल्य की जांच करने और आवश्यकता होने पर' GetLastError' की जांच करने का सुझाव दूंगा। अन्यथा, मेरे पास कोई सुराग नहीं है! –
ने 'ReadConsoleW' के वापसी मूल्य की जांच की, लेकिन प्रत्येक बार वापसी मूल्य nonzero था, इसलिए कोई त्रुटि नहीं। इसके अलावा जब यह ढेर भ्रष्टाचार के साथ दुर्घटनाग्रस्त हो जाता है, तो डीबगर प्रोग्राम के अंत में होता है। – Josh