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>
在网上搜索后我得到 this 说 cin.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
希望对你有所帮助
以前我在 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>
在网上搜索后我得到 this 说 cin.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
希望对你有所帮助