簡體   English   中英

為什么 getchar() 只在按下另一個鍵后返回 (char)13 ? (視窗)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM