1

そこで、C でキーボード アクティビティをキャッチする方法を考えています。ご存知のように、何かを入力して Enter キーを押すと、コンピューターに送信したいものをストリーミングできます。しかし、最初の質問は、上矢印、下矢印などの入力できない文字を入力する方法です (特に、Linux を使用しているが、デフォルトの意味以外の目的で使用したいため、これらの 2 つの文字)、shift、ctrl など。第二に、キーを押した直後にプログラムを進行させる方法です。(Windows の「続行するには何かキーを押してください」のようなものです)。

4

4 に答える 4

2

2 つの方法があります。

sttyコマンドの使用。

  • system ("/bin/stty raw");使用する前に追加できますgetchar()
  • 詳細については、お問い合わせくださいman stty

ここを使うtermios.h

  • このようにttyのモードを変更する必要がありますnewt.c_lflag &= ~(ICANON | ECHO);
  • 詳細については、man termios.h
于 2012-06-26T01:24:13.267 に答える
1

DOS時代には、kbhit()機能がありました。その機能が必要な場合は、このスレッドを見ることができます: kbhit() for linux

ユーザー Thantos の機能を試してみたところ、かなりうまく機能したことをぼんやりと思い出します。

tcgetattr()最初にとのtcsetattr()機能について読むことをお勧めします。

于 2012-06-26T09:02:51.753 に答える
0

Linux を使用している場合、キーボード入力に最適なのは GNU readlineライブラリです。

これにより、必要に応じて emacs および vi 編集モードを含むすべての機能がすぐに利用できます。

/* A static variable for holding the line. */
static char *line_read = (char *)NULL;

/* Read a string, and return a pointer to it.  Returns NULL on EOF. */
char *
rl_gets ()
{
    /* If the buffer has already been allocated, return the memory to the free pool. */
    if (line_read)
    {
        free (line_read);
        line_read = (char *)NULL;
    }

    /* Get a line from the user. */
    line_read = readline ("");

    /* If the line has any text in it, save it on the history. */
    if (line_read && *line_read)
        add_history (line_read);

    return (line_read);
}

MITには優れたチュートリアルがいくつかあります。

于 2012-06-26T01:13:31.807 に答える
0

「ユニバーサル」メソッドは getchar () です。Getchar()" は "バッファリングされた入力" を使用します:ユーザーが "Enter" を押すまで、実際には出力を取得しません。また、コマンド プロンプト (または同等のもの) を使用していない限り、実際には適用できません

古い DOS のやり方は、"conio.h" からの getch() と getche() でした。このメソッドは、最新のオペレーティング システムをターゲットとする最新の C/C++ ライブラリには存在しません。

提案:

テキストモードの UI を作成したい場合 (特に Linux で)、ncurses を見てください:

(Windows または Linux で) ゲームをプログラミングする場合は、SDL を参照してください。

=== 補遺 ===

私はまだライブラリをお勧めします...しかし、Linuxでの「生のキーボード入力」(別名「未調理」または「非標準」入力)を説明する関数は次のとおりです。

http://cboard.cprogramming.com/c-programming/63166-kbhit-linux.html

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>

void changemode(int);
int  kbhit(void);

int 
main(int argc, char *argv[])
{
  int ch;
  changemode(1);
  while ( !kbhit() )
  {
    putchar('.');
  }

  ch = getchar();

  printf("\nGot %c\n", ch);

  changemode(0);
  return 0;
}

void 
changemode(int dir)
{
  static struct termios oldt, newt;

  if ( dir == 1 )
  {
    tcgetattr( STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);
  }
  else
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}

int 
kbhit (void)
{
  struct timeval tv;
  fd_set rdfs;

  tv.tv_sec = 0;
  tv.tv_usec = 0;

  FD_ZERO(&rdfs);
  FD_SET (STDIN_FILENO, &rdfs);

  select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
  return FD_ISSET(STDIN_FILENO, &rdfs);

}
于 2012-06-26T01:06:01.820 に答える