1

Enterキーを押さなくても入力にすぐに反応するUbuntuでC++プログラムを書きたいと思います。#include <conio.h>(-> UNIX システムで作業しているため、ヘッダーを使用できません)

例: キーボードでキー "a" を押しますが、端末に "a" が表示される代わりに、プログラムは "p" を表示するはずです。

過去 2 日間、ヘッダーでこれを実行しようとしました#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 に答える