Linux等效于conio.h getch()

时间:2015-12-26 19:43:25

标签: c++ c

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

gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

编译器。这不支持#include<conio.h>头文件,因此我不能在程序中使用getch()函数。

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

在网上搜索之后,我得到了this,其中cin.get();可能是最接近的等价物,但这两者的区别在于如果我们写getch()它不会显示输入的字符控制台,如果我们使用cin.get()输入一个字符,它会在控制台上显示该字符。我不希望该字符显示在控制台上。

使用getchar()也会在控制台上显示该字符。

2 个答案:

答案 0 :(得分:4)

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

#include "curses.h"

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

答案 1 :(得分:0)

有一个主题用以下代码回答这个问题:

#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

我希望它可以帮到你。