Linux 相当于 conio.h getch()

Linux equivalent for conio.h getch()

以前我在 windows 上使用支持 #include <conio.h> 头文件的 c++/c 编译器,但在 Linux 上我有

gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software...

我想要一个与 getch() 完全相同的函数。不知道为什么我的编译器不支持头文件#include <conio.h>

在网上搜索后我得到 thiscin.get(); 可能是最接近的等价物,但这两者的不同之处在于如果我们写 getch() 它不会显示在控制台上输入的字符,而如果我们使用 cin.get() 输入字符,它会在控制台上显示该字符。我不想让角色显示在控制台上。

使用 getchar() 也会在控制台上显示角色。

有许多不同的方法可以更方便地执行此操作。最简单的是使用 curses:

#include "curses.h"

int main() {
    initscr();
    addstr("hit a key:");
    getch();
    return endwin();
}

有一个线程使用以下代码回答了这个问题:

#include <stdio.h>
#include <termios.h>

char getch() {
    char buf = 0;
    struct termios old = { 0 };
    fflush(stdout);
    if (tcgetattr(0, &old) < 0) perror("tcsetattr()");
    old.c_lflag    &= ~ICANON;   // local modes = Non Canonical mode
    old.c_lflag    &= ~ECHO;     // local modes = Disable echo. 
    old.c_cc[VMIN]  = 1;         // control chars (MIN value) = 1
    old.c_cc[VTIME] = 0;         // control chars (TIME value) = 0 (No time)
    if (tcsetattr(0, TCSANOW, &old) < 0) perror("tcsetattr ICANON");
    if (read(0, &buf, 1) < 0) perror("read()");
    old.c_lflag    |= ICANON;    // local modes = Canonical mode
    old.c_lflag    |= ECHO;      // local modes = Enable echo. 
    if (tcsetattr(0, TCSADRAIN, &old) < 0) perror ("tcsetattr ~ICANON");
    return buf;
 }

它使用 termios 驱动程序接口库,它是 POSIX (IEEE 1003.1)

的一部分

有关此库的更多参考,请阅读:The header contains the definitions used by the terminal I/O interfaces

希望对你有所帮助