[英]Why does getchar() only return (char)13 after another key has been pressed? (windows)
我在玩 Windows 控制台 API 並發現了一些有趣的行為。 使用這個 function:
void defConsole() {
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode = 0;
GetConsoleMode(hStdIn, &mode);
SetConsoleMode(hStdIn, mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT));
}
我能夠做到這一點,使終端表現得像非規范的 *nix 終端。 (getchar 不等待輸入,也不顯示你寫的內容,比如 conio.h 的 getch 或 unistd.h 的 getpass)。 然后我嘗試打印每個字符及其 ascii(?) 值。
int main() {
char c;
defConsole();
while (1) {
c = getchar();
printf("%c %d\n", c, (int)c);
}
}
然而,發生了一些有趣的事情:當我按下回車鍵時,什么也沒發生,但是我按下的下一個鍵將被它覆蓋(ascii 代碼 13),並且下一個鍵將打印最后一個鍵和它本身。
為什么會這樣? 我能做些什么來阻止這種情況? 我應該將其更改為使用 winapi 的鍵盤輸入功能嗎? 這對我來說似乎有點矯枉過正。
為了符合 C 的行尾標准,必須將\r\n
替換為\n
。 但是在得到\r
之后的字符之前,您無法知道序列是否為\r\n
,因此必須對其進行緩沖,直到下一個字符進入。嘗試在Enter
后鍵入Ctrl-J
( \n
) 以查看怎么了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.