関数が<curses.h>
何をするかを調べましたか?getch()
ヒント: OSX と Linux は Windows と同じではありません。
具体的には、 のマクロとして<curses.h>
、次のことがわかります。
#define getch() wgetch(stdscr)
現在、あなたのシステムでgetch()
は、curses ライブラリに実際の関数があるように見えますが、それはstdscr
セットアップされることを期待しており、それは curses 初期化関数 (initscr()
および関連関数) によって行われ、コードによってシグナル的に行われていません。 . したがって、コードは、正しい初期化が行われる前に curses ルーチンを呼び出して未定義の動作を呼び出しており、クラッシュにつながっています。
(dmckee からの良いヒント - acidzombie24 からリンク行を取り出すのに役立ちました。これは重要でした。)
単一のキーストロークを読み取ってプログラムを正常に終了できるようにするには、Unix (OSX、Linux) でかなりの作業を行う必要があります。端末の初期状態をトラップし、atexit()
関数 (または同様のメカニズム) を手配して端末の状態を復元し、端末をクック モードから raw モードに変更し、関数を呼び出して文字を読み取る必要があります (おそらくだけread(0, &c, 1)
)、終了します。他の方法もあるかもしれませんが、確かにいくつかのセットアップと分解操作が必要です。
Mark Rochkind によるAdvanced Unix Programming, 2nd Ednが参考になるかもしれません。必要なレベルでの端末処理をカバーしています。または、適切に使用することもできます<curses.h>
。これは、独自のソリューションよりも簡単で、おそらくより信頼性が高くなります。