
Linuxのgccでのプログラミングで、キーボードのどのキーが押されたのかを変数に代入したりして取得したりすることはできないでしょうか?
例えば、while分で永久ループを作っておいて、
while(1)
{
if(aのキーが押されている場合)
printf("A key is pushing!")
elseif(sのキーが押されている場合)
printf("B key is pushing!")
elseif(dのキーが押されている場合)
printf("D key is pushing!")
・・・
}
このようなプログラムを作ることはできないでしょうか?
どうぞ、ご教授の程よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
できますが、かなり面倒です。
termiosやncursesなんかを調べて見るといいかも。
この回答への補足
お世話になっております。
現在、Ubuntu Linuxのgccを使っており、curuses.hを試しているのですが、次のようなエラーが出てきます。
root@ubuntu:~/20140411# gcc -o test_getchar test_getchar.c
test_getchar.c:3:21: fatal error: curses .h: No such file or directory
#include <curses .h>
^
compilation terminated.
これはどのようなエラーなのか教えて頂けませんでしょうか?
curses.hというのが使えないと言うことでしょうか?
どうぞ、ご教示頂きますようお願い致します。
回答頂きありがとうございます。
#1の方に教えて頂いたプログラムをやってみたのですが、
このgetchar()関数ですが、何か文字を入力してからエンターキーが押されないと、cの変数に値が代入されないようですが、例えば1文字入れたら、自動的にエンターキーを入力するようにすることはできないでしょうか?
また、数秒たったら、自動的にcに値を代入して、次のステップに自動的に進むようにするようなことはできないのでしょうか?
今回教えて頂いたncursesというのでがありますが、
http://taichino.com/programming/1925
こちらのサイトに載っている
// キー入力する場合は以下
keypad(stdscr, true);
wtimeout(stdscr, 100); // 100ミリ秒でgetchがタイムアウト
このような関数が使えれば、エンターキーを押さなくても定期的なキーの値の取得ができると言うことなのでしょうか?
すみませんが、どうぞよろしくお願い致します。
No.6
- 回答日時:
簡単にはこんな感じで。
#include <stdio.h>
main(){
int c;
system("stty -icanon -echo");
while(1){
c = getchar();
if(c < ' ') break; /* 制御文字がキーインされたら終了 */
printf("%c key is pushed\r\n",c);
}
system("stty icanon echo");
}
回答頂きありがとうございます。
実際にこの方法をやってみました。これだとエンターキーを入れる必要がないのが確かに便利なことがわかりました。ただ、何もキーが入力されないとgetchar()でペンディング状態になるのと、IO入力のようなON/OFFの使い方はできないということも実感したのですが、ちょっとしたトグル入力などはなかなか使えるような気がしました。
いまこのような感じでコードを使わせてもらってます。
http://sourceforge.jp/projects/cc1101driver/scm/ …
No.5
- 回答日時:
基本的には割り込みプロセスなので
http://sourceforge.jp/projects/linux-kernel-docs …ハードウェア割り込み処理
此れを改造すれば実現可能と考えます。
割り込みが発生した時にフラグを立てメインプロセスからサブプロセスにジャンプしています。
尚その際には16進データをASCIIに変換するテーブルを参照して表示しました。
回答頂きありがとうございます。
いつかはハードウェア割り込み処理とか、カーネルとかハード制御に関わるプログラミングとかカーネルビルドも見ていきたいと思っています。いろいろと険しそうな感じはしていますががんばりたいと思います。
No.4
- 回答日時:
>このgetchar()関数ですが、何か文字を入力してからエンターキーが押されないと、cの変数に値が代入されないようですが、例えば1文字入れたら、自動的にエンターキーを入力するようにすることはできないでしょうか?
自動でエンターキーを入力するような事はできません(私が知らないだけという可能性はあります)。
また、#3の方もおっしゃっていますがgetchar()は標準入力からの入力なので、その入力がキーボードとは限りません。
>また、数秒たったら、自動的にcに値を代入して、次のステップに自動的に進むようにするようなことはできないのでしょうか?
どういう事をやりたいのかよくわかりません。
「自動的に」とはどういう事ですか?
コードを書かなくてもプログラム側で勝手に判断してやって欲しいという事ですか?
>このような関数が使えれば、エンターキーを押さなくても定期的なキーの値の取得ができると言うことなのでしょうか?
引用されてたヶ所は、何らかのキーが入力されていなくてもgetch()を呼び出してから100ミリ秒後にはタイムアウトして値を返すための設定ですけど(getch()はncursesが提供している関数)。
もしそれをncursesを使わずに行いたいということであれば先にもあげたtermiosを調べてみてください。
>これはどのようなエラーなのか教えて頂けませんでしょうか?
メッセージに書かれていますけど?
英文読む気がない。
辞書を引きたくない。
英文読んでもわからないと諦めてる。
読んでみたが何の事かわからない。
その他。
どれでしょう?
もし最初の3つのどれかなら英文読む努力くらいはしてください。
curses.h と書く所を curses .h と書いてしまってるのが原因ではあるんでしょうが。
回答頂きありがとうございます。まだcursesやってないのですが、とりあえずという感じで擬似的なIO入力で逃げるようなことやってみました。
No.1
- 回答日時:
#include<stdio.h>
main(){
int c; /* キーボードから受け取った文字を入れておく変数 */
c = getchar(); /* キーボードから1文字だけ受け取る */
printf("c = %c \n", c); /* [%c]を使って文字を表示 */
printf("c = %d \n", c); /* [%d]を使って、文字を数値として表示できる */
}
こういうのが載っていました。
回答頂きありがとうございます。
このgetchar()関数ですが、何か文字を入力してからエンターキーが押されないと、cの変数に値が代入されないようですが、例えば1文字入れたら、自動的にエンターキーを入力するようにすることはできないでしょうか?
また、数秒たったら、自動的にcに値を代入して、次のステップに自動的に進むようにするようなことはできないのでしょうか?
すみませんが、どうぞよろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- フリーソフト 1秒毎にキーの←を押すソフト 1 2023/03/06 04:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- マウス・キーボード パソコンのゲームで押しずらいキーがあったのでchange keyというキーの割り当てを変える ソフト 1 2023/03/17 09:43
- マウス・キーボード テンキーの設定がおかしくなっています。 5 2023/08/09 15:35
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Mac OS mac os xの設定の(起動ディスク)にブート用dvdが表示されません 1 2022/05/28 13:29
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- Java Java 南京錠 2 2023/02/04 11:46
- マウス・キーボード キーボードのCaps Lockキーと変換キーの挙動がおかしくなりました。 4 2022/09/04 22:44
- UNIX・Linux Ubuntuのアプリ版?が起動しません 1 2022/04/29 16:56
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++の課題が分かりません。
-
ゲームダンジョンの武器の装備...
-
Linuxで入力待ちなしkeyread関...
-
UWSCで変数をキー入力
-
通信対戦ゲームでの通信遅延に...
-
キーボードからアルファベット...
-
最大公約数と最小公倍数を求め...
-
至急教えてください!プログラ...
-
scanf関数を用いての標準演算子...
-
あるキーを押したら強制終了さ...
-
C言語でのカレンダー作成
-
ワードで文字を入力する時の変...
-
scanf関数について
-
scanfが2回使えない・・・?;
-
Eclipseコンソール表示を、リセ...
-
C言語 While文(ループ)内の...
-
cout関数を使っているのですが...
-
C言語 逆ピラミッドの作り方
-
MinGWのC言語でCTRL+Zで処理が...
-
標準入力でEnter入力でも改行さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
プログラミング初心者です。 Py...
-
C言語でgetchar();が上手く使え...
-
Excel VBAで、Application.Inpu...
-
電卓の小数点
-
cout関数を使っているのですが...
-
"scanf"でエンターで改行させな...
-
小数か整数かを判定する方法
-
至急教えてください!プログラ...
-
getchar()について 教えてくだ...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
コマンドプロンプトからのEOFの...
-
IF文で戻ることはできますか?...
-
プログラミングの問題です 「金...
おすすめ情報