如何清除控制台输入缓冲区C/C++ winapi

问题描述 投票:0回答:1

我基本上是在制作自己的控制台 I/O(所以没有 cout、cin 等),但有时当我读取输入时,我不会读取缓冲区上的所有字符,因为我可以选择要读取的数量,但是下次我调用

ReadConsoleA/W()
时,它不会等待用户输入,因为它会读取缓冲区中剩余的内容。我尝试了
FlushConsoleInputBuffer()
,但没有成功,这基本上是我所拥有的:

#inlcude <windows.h>

// These globals are here just for the example
DWORD bytes;
HANDLE in;
HANDLE out;

void WrtConsole(const char* text, DWORD size)
{
    WriteConsoleW(out, text, size, &bytes, 0);
}

void ReaConsole(char* text, DWORD max_size)
{
    FlushConsoleInputBuffer(in);

    ReadConsoleA(in, text, max_size, &bytes, 0);
}

// Im using `int WINAPI mainCRTStartup()`, but it doesnt matter, Im just not using any iostream things.
int main()
{
    out = GetStdHandle(STD_OUTPUT_HANDLE);
    in = GetStdHandle(STD_INPUT_HANDLE);

    char num1[4];
    char num2[4];
    
    WrtConsole(L"First number: ");
    ReaConsole(num1, 4);
    WrtConsole(L"Second number: ");
    ReaConsole(num2, 4);

    // ...
}

现在,例如,如果用户输入 3 位数字,例如 100,则

ReadConsole()
函数将读取“1”、“0”、“0”、“ '但会离开' ' 在输入缓冲区中,导致下一次调用
ReadConsole()
有效地跳过它。
正如我所说
FlushConsoleInputBuffer()
不起作用,那么,如何清除控制台的输入缓冲区,以便下次调用
ReadConsole()
时不会“跳过”?

c winapi console
1个回答
0
投票

我明白了!

问题是

ReadConsole
ReadConsole
从控制台输入缓冲区读取字符输入并将其从缓冲区中删除。

但是,您设置的

max_size
并不代表MAX尺寸!实际上它默认为0。 当我设置为16时,可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.