2016-08-11 8 views
0

私はユーザからの入力を受け取り、ユーザが矢印キーを入力として断念したかどうかをチェックしたいと思います。私はgetch関数を試してみましたが、ユーザーは文字を入力することしかできません。私はそのユーザーが上下の矢印キーまたは複数の文字を含む任意の文字列を入力することができます。後で、ユーザーが入力キーまたは他の文字列としてキーを放棄したかどうかを確認したい。助けてください。linuxのcプログラムに矢印キーを入力するには

+1

これを見てくださいhttp://stackoverflow.com/a/11432632/1791872 – Caw

+0

これまでのところあなたの研究/デバッグの取り組みを示してください。まず[Ask]ページをお読みください。 –

+0

[NCURSES](https://stackoverflow.com/questions/31963835/how-to-read-terminals-input-buffer-immediately-after-keypress/31964140#31964140)はどうですか? – Michi

答えて

0

、あなたの答えを見つけるためにhereを見ていないことを主張しなければならない場合は...

私はこれを試してみましたが、私はgetchは機能を使用することはできませんので、私のコンパイラはconioのlibをサポートしていません。

なぜgetch()を使用する必要がありますか?他の関数を使用して入力を取得し、作業を行うことができます。

第2に、文字列も入力できるようにしたいので、fgets()のような関数を使用する必要があります。

私の例では、望むなら私はfgets()を使用しました。

しかし、問題はfgets()は入力として矢印を使用しません。私はこれを行うことができる他の方法はありますか?

端末に上向きの矢印が入力されていると、各コンピュータで異なるように見える場合があります。たとえば、私のコンピュータで上矢印を入力すると、次のようになります。^[[Aしかし、それは見える、fgets()入力として矢印をしません。リンクされた質問で見たように:

1は、矢印キーを押すことでgetchは バッファに三つの値をプッシュします:

  • '\033'
  • '['

  • 'A', 'B', 'C' or 'D'

上矢印の場合は「A」、下矢印の場合は「B」、右矢印を入力する場合は「C」、左矢印を入力する場合は「D」。私の例では、上向き矢印のみを処理していますが、他の矢印も検出するようにプログラムを適合させるのは簡単です。今すぐ上の例に

#include <stdio.h> 
#include <string.h> 

#define MAX_STRING_SIZE 100 

void flush_input(char userInput[]); 

int main(void) { 
    char input[MAX_STRING_SIZE] = {0}; 
    int i; 
    int upArrow = 0; //1 if up arrow found, 0 if not found 

    printf("Enter anything with an up arrow key (or not if you so choose):\n"); 
    fgets(input, sizeof(input), stdin); 
    flush_input(input); 

    size_t inputLen = strlen(input); 

    for (i = 0; i < (int)inputLen; i++) { 
    if (input[i] == '\33') { 
     if(input[i+2] == 'A') { 
     upArrow = 1; 
     } 
    } 
    } 

    if (upArrow != 0) { 
    printf("You entered an up arrow somewhere in the input\n"); 
    } else { 
    printf("You did not enter an up arrow anywhere\n"); 
    } 
    return 0; 
} 


void flush_input(char userInput[]) { 
    if(strchr(userInput, '\n') == NULL) { 
    /* If there is no new line found in the input, it means the [enter] character 
    was not read into the input, so fgets() must have truncated the input 
    therefore it would not put the enter key into the input. The user would 
    have typed in too much, so we would have to clear the buffer. */ 
    int ch; 
    while ((ch = getchar()) != '\n' && ch != EOF); 
    } else { 
    //If there is a new line, lets remove it from our input. fgets() did not need to truncate 
    userInput[strcspn(userInput, "\r\n")] = 0; 
    } 
} 

我々は'\033'があるかどうかをチェックすることにより、矢印を検出し(このような8進コードで、あなたは0がそう'\33'をチェックすることもある必要はないことに注意してください有効な場合)、存在する場合は、if(input[i+2] == 'A')で2文字前にチェックします('['をスキップします)。これが当てはまる場合は、上矢印キーが入力されていることがわかります。

のは、(私の端末では、上矢印キーが^[[Aようになっていることを覚えておいてください)いくつかの例のテストを実行してみましょう:あなたはpossible duplicateはなかったと思った理由

 
[email protected] Stack Overflow $ ./a.out 
Enter anything with an up arrow key (or not if you so choose): 
hello^[[A 
You entered an up arrow somewhere in the input 
[email protected] Stack Overflow $ ./a.out 
Enter anything with an up arrow key (or not if you so choose): 
bye bye 
You did not enter an up arrow anywhere 

だから、結論で、私にはわかりませんgetch()を使用できなかったために動作します。入力を取得するために使用する関数は完全に無関係です。このプロセスで唯一重要な部分は、端末に矢印キーがどのように入力されているかを理解することです。

関連する問題