Linux では、getch()
おそらくcurses
同じ名前の Windows 固有の関数とはかなり異なる関数です。 curses
( ncurses
) は、やりたいことに対しておそらくやり過ぎです。
最も簡単な方法は、ユーザーが を押すまで待つEnterことです。これは次のように実行できます。
int c;
printf("Press <enter> to quit: ");
fflush(stdout);
while ((c = getchar()) != '\n' && c != EOF) {
/* nothing */
}
ユーザーが だけでなく任意のキーを押せるようにしたい場合は、次のEnterようにすることができます。
system("stty cbreak -echo");
getchar();
system("stty cooked echo");
2 つ目stty
は、tty を適切な設定に復元することを目的としています (実際にはそれらを元の状態に復元する必要がありますが、状態の保存と復元はもう少し複雑です)。おそらく、それを行うためのよりクリーンな方法があります(stty
プログラム自体が使用するライブラリ関数を使用します)。
編集:待機せずに単一の文字を読み取ることEnterは、よくある質問です。実際、これはcomp.lang.c FAQの質問 19.1です。
EDIT2:最近、curses を使った作業はあまりしていませんが、ちょっと遊んでみました。最初に呼び出して画面をクリアしgetch()
ない限り、機能しないようです。curses は、表示を完全に制御する必要があるテキスト エディターなどのアプリケーションで使用することを目的としています。画面を制御せずに使用する方法があるかもしれませんが、私は見つけていません。initscr()
initscr()
getch()
クラッジは実際には最良のsystem("stty ...")
アプローチかもしれません。
EDIT3:他の回答のtermios
解決策はおそらく最良です(system("stty ...")
より簡単ですが、外部プログラムを呼び出すのはやり過ぎのように感じます.
OPのコメント「Press any key to exit.
Cで行うのがとても面倒だとは信じられない」については、はい、それは奇妙に思えますが、さらに考えてみると、それには正当な理由があります。
典型的な Unix または Linux システムにインストールされているプログラムを見てみましょう。この種の入力 (キーを 1 回押すのを待つ) を必要とするものはほとんどないことがわかると思います。
多くのプログラムは、コマンド ライン引数と、ファイルまたは .xml から読み取ったデータを使用して動作しますstdin
。ユーザーが入力するものはすべて入力データであり、コマンドやプロンプトへの応答ではありません。
一部のプログラムは、いくつかのアクションに対して確認を求めます (インストーラーはこれを好みapt-get
、cpan
しばしばこれを行います)。ただし、通常は入力行を読み取り、最初の文字をチェックします。または、いくつかの抜本的なアクションの場合、「はい」という単語全体を入力し、その後に続けて入力する必要がある場合がありますEnter(誤ってキーを押したためにハード ドライブを再フォーマットしたくない場合)。
もちろん、多くのプログラム (テキスト エディター、ファイル ビューアー) は 1 文字の非エコー入力を読み取りますが、そのようなプログラムは curses ベースである傾向があります。それらは端末ウィンドウ全体を制御します。
最後に、多くのプログラムには GUI インターフェース (Web ブラウザーなど) があります。彼らはおそらく標準入力からさえ読んでいません。
Press any key to exit
ほとんどの本番 Unix プログラムは、プロンプトを使用しないか、または必要としません。彼らは、多くの場合黙って仕事をし、その後終了するので、次のことができます。宿題などの比較的初歩的なプログラムが主に必要とされています。宿題に何か問題があるわけではありませんが、システム全体として、そのような使用法をサポートするように設計されているわけではありません。