私はユーザからの入力を受け取り、ユーザが矢印キーを入力として断念したかどうかをチェックしたいと思います。私はgetch関数を試してみましたが、ユーザーは文字を入力することしかできません。私はそのユーザーが上下の矢印キーまたは複数の文字を含む任意の文字列を入力することができます。後で、ユーザーが入力キーまたは他の文字列としてキーを放棄したかどうかを確認したい。助けてください。linuxのcプログラムに矢印キーを入力するには
答えて
、あなたの答えを見つけるために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()
を使用できなかったために動作します。入力を取得するために使用する関数は完全に無関係です。このプロセスで唯一重要な部分は、端末に矢印キーがどのように入力されているかを理解することです。
- 1. スライダーを矢印キーの入力にバインドする方法は?
- 2. Sfmlテキスト入力された矢印キー
- 3. C#と矢印キー
- 4. Cでstdinから矢印キーを無視するには?
- 5. ユーザからのインタラクティブ入力を取得し、入力中に矢印キーを使用する方法は?
- 6. Selectizeで右矢印キーと左矢印キーを有効にする方法
- 7. 矢印キーからの入力の取得
- 8. リッチで矢印キー入力を無視:scrollableDataTable
- 9. scanfとcの矢印キーの対応
- 10. Linux Cコンソールアプリケーションでキー入力をシミュレート
- 11. LinuxまたはSolarisではCキーを使用して矢印キーを検出する方法は?
- 12. フォームと矢印キーのC#フォーカス
- 13. 矢印キーのユニコード?
- 14. SpriteKitの矢印キー
- 15. 入力とテキストエリアで矢印キーが機能しない
- 16. UIKeyCommand矢印キー入力が機能しない
- 17. input()関数のデータを入力中に矢印キーが機能しない
- 18. ユーザーフォームのテキストボックスにある矢印キー、VBA
- 19. vimは矢印キーを通常のプログラムのように動作させます
- 20. c#/ wpfイベントによる矢印キーのシミュレート
- 21. ページネーション(右矢印キー)
- 22. 矢印キーでナビゲートサムネイルギャラリー
- 23. AIX - デフォルトシェル - 矢印キー
- 24. 矢印付きのPython生の入力
- 25. リマップ矢印キーをvimの
- 26. 入力フィールド内にドロップダウン矢印を追加する
- 27. レンダリングされた入力テキストボックスが矢印キーに反応しない
- 28. C# - 矢印キーを使用して入力フィールドを切り替えることを許可する
- 29. 左矢印キーを使用して入力ボックスからスパンにナビゲートするには
- 30. のVim - キー右矢印
これを見てくださいhttp://stackoverflow.com/a/11432632/1791872 – Caw
これまでのところあなたの研究/デバッグの取り組みを示してください。まず[Ask]ページをお読みください。 –
[NCURSES](https://stackoverflow.com/questions/31963835/how-to-read-terminals-input-buffer-immediately-after-keypress/31964140#31964140)はどうですか? – Michi