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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
餃子を食べるとき、何をつけますか?
みんな大好き餃子。 ふと素朴な疑問ですが、餃子には何をつけて食べますか? 王道は醤油とお酢でしょうか。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
架空の映画のネタバレレビュー
映画のCMを見ていると、やたら感動している人が興奮で感想を話していますよね。 思わずストーリーが気になってしまう架空の感動レビューを教えて下さい!
-
Linuxで入力待ちなしkeyread関数のようなものはありますか?
C言語・C++・C#
-
ループを途中で抜けたいのですが。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
EDITコントロールで入力できる...
-
プログラミングの問題です 「金...
-
Excel VBAで、Application.Inpu...
-
Linuxで入力待ちなしkeyread関...
-
数字以外が入力されたらエラー...
-
Userformの入力順序をタブオー...
-
特定の文字が入力されるまで・・・
-
UWSCで変数をキー入力
-
Linuxプログラミングで、キーボ...
-
正負を反転させて出力するプロ...
-
vba
-
cout関数を使っているのですが...
-
if文の条件にscanf関数を使うと…?
-
Eclipseでコマンドラインを入力...
-
VB カウントダウンタイマーの作...
-
getcharをしながらwhile文で出...
-
C言語scanf_sで何故か2回入力に...
-
getc 等の違い
-
漢字のソートについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
java初心者です。入力されたの...
-
Excel VBAで、Application.Inpu...
-
ワードで文字を入力する時の変...
-
WindowsでEOF
-
batプログラム上で文字列を入力...
-
getchar()について 教えてくだ...
-
cout関数を使っているのですが...
-
コマンドプロンプトからのEOFの...
-
"scanf"でエンターで改行させな...
-
VisualStudio2019のコードアナ...
-
至急教えてください!プログラ...
-
C言語scanf_sで何故か2回入力に...
-
scanf が無視されます
-
EDITコントロールで入力できる...
おすすめ情報