1

我想在 Ubuntu 上编写一个 C++ 程序,它会立即对输入做出反应,而无需按 Enter。(-> 我不能使用标题#include <conio.h>(->由于我在 UNIX 系统上工作,我

例如:我在键盘上按下键“a”,但程序应该显示“p”而不是在终端中显示“a”。

在过去的两天里,我试图用标题做到这一点#include <ncurses.h>。不幸的是,它不起作用。

因此,我想请教您的请求。

使用 conio.h 它会是这样的:

#include <iostream> 
#include <conio.h> 
#include <string> 
using namespace std;

int main(void) 
{
    char c;
    c = getch();

    while(true)
    {

        if(c=='a')
        {
        putch('p');
        }

        else
        {
        putch(c);
        }

    c = getch();

    }

  cin.sync();              
  cin.get(); 
}

您能否简单地发布工作源代码#include <ncurses.h>而不是#include <conio.h>发布工作源代码?

提前非常感谢你!!!

最诚挚的问候

夸克42

谢谢Paulo1205!!!

这是我没有 conio.h的最终代码:

#include <iostream> 
#include <string> 
#include <unistd.h>  
#include <termios.h>
#include <ncurses.h>
using namespace std;

int my_getch(void){
  struct termios oldattr, newattr;
  unsigned char ch;
  int retcode;
  tcgetattr(STDIN_FILENO, &oldattr);
  newattr=oldattr;
  newattr.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newattr);
  retcode=read(STDIN_FILENO, &ch, 1);
  tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);
  return retcode<=0? EOF: (int)ch;
}



int main(void) 
{
    char c;
    c = my_getch();

    while(true)
    {

        if(c=='a')
        {
        putchar('p'); fflush(stdout);
        }

        else
        {
        putchar(c); fflush(stdout);
        }

    c = my_getch();

    }

  cin.sync();              
  cin.get(); 
}
4

1 回答 1

2

如果你只想快速替换旧的 ConIO getch(),下面的代码就足够了。

int my_getch(void){
  struct termios oldattr, newattr;
  unsigned char ch;
  int retcode;
  tcgetattr(STDIN_FILENO, &oldattr);
  newattr=oldattr;
  newattr.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newattr);
  retcode=read(STDIN_FILENO, &ch, 1);
  tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);
  return retcode<=0? EOF: (int)ch;
}

但是,请注意旧的 DOS ConIO 是 UNIX Curses 包的精简版,它提供了文本终端屏幕操作所需的一切。

编辑:无论如何,诅咒肯定是要走的路。如果您想处理箭头键或功能键,而无需为每种类型的终端了解与它们相关的转义序列,您宁愿学习Curses及其自己的getch().

此外,如果您认为您需要使用 UTF-8 或任何其他多字节表示来支持 ASCII 范围之外的字符,那么您最好使用ncursesw库的函数get_wch()及其姐妹。

于 2015-12-01T16:40:38.023 回答