Mac/Linux のクラッシュに対する Windows の getch() と同等

<curses.h> を見ましたか getch() が何であるかを確認するには

ヒント:OSX と Linux は Windows と同じではありません。

具体的には <curses.h> のマクロとして 、次のことがわかります:

#define getch() wgetch(stdscr)

ここで、システム上に実際の関数 getch() があるように見えます curses ライブラリに含まれていますが、stdscr が必要です。 これは、curses の初期化関数 (initscr() および親戚)、そしてそれはあなたのコードによって行われていないことを示しています。そのため、コードは、正しい初期化が行われる前に curses ルーチンを呼び出して未定義の動作を呼び出しており、クラッシュにつながっています。

(dmckee からの良いヒント - acidzombie24 からリンク行を取り出すのに役立ちました。これは重要でした。)

単一のキーストロークを読み取ってプログラムを正常に終了できるようにするには、Unix (OSX、Linux) でかなりの作業を行う必要があります。端末の初期状態をトラップし、 atexit() を手配する必要があります 関数または同様のメカニズム-端末の状態を復元し、端末をクックモードから生モードに変更し、関数を呼び出して文字を読み取ります(おそらく read(0, &c, 1) )、終了します。他の方法もあるかもしれませんが、セットアップと破棄の操作が必要になることは間違いありません。

Mark Rochkind による Advanced Unix Programming, 2nd Edn が参考になるかもしれません。必要なレベルでの端末処理をカバーしています。または、 <curses.h> を使用できます これは独自のソリューションよりも簡単で、おそらくより信頼性が高くなります。


あなたは出品していません

#include <stdio.h>

または

#include <curses.h>

または類似の行。 含むライブラリに対してリンクしていますか? getch() ?