Mac / LinuxクラッシュのWindows getch()と同等
質問
getch()
を使用していますが、アプリがすぐにクラッシュします。以下を含む:
int main()
{
getch();
}
リンクを見つけることができませんが、問題はおそらく、それらの行に沿ってバッファリングまたは奇妙な何かをオフにする必要があることであり、クロスプラットフォームコードと一緒にcout
を動作させたいです
std::cin.get()
を使用するように指示されましたが、ユーザーが文字または数字を入力してEnterキーを押して終了するのではなく、キーが押されたときにアプリを終了したいです。
これに機能はありますか?コードはMac(my os)およびWindowsで動作する必要があります。
リンク/コンパイルは、問題ではありません。 XCodeに<curses.h>
を含めて-lcurses
とリンクしますが、Windowsは<conio.h>
を使用します。
解決
<curses.h>
を見て、getch()
関数の機能を確認しましたか?
ヒント:OSXとLinuxはWindowsとは異なります。
具体的には、stdscr
のマクロとして、次のことがわかります。
#define getch() wgetch(stdscr)
現在、システム上ではcursesライブラリの実際の関数initscr()
のように見えますが、atexit()
がセットアップされていることが期待され、それはcurses初期化関数(read(0, &c, 1)
および親relative)、およびそれはあなたのコードによって合図されません。そのため、コードは、正しい初期化が行われる前にcursesルーチンを呼び出して未定義の動作を呼び出し、クラッシュを引き起こしています。
(dmckeeからの良いヒント-それはacidzombie24からリンク行を取り出すのに役立ちました。これは重要でした。)
単一のキーストロークを読み取ってプログラムを正常に終了できるようにするには、Unix(OSX、Linux)で多くの作業を行う必要があります。端末の初期状態をトラップし、<=>関数または類似のメカニズムを準備して端末の状態を復元し、端末をクックモードからrawモードに変更してから、関数を呼び出して、文字(おそらく<=>)を入力して、終了します。他の方法もありますが、セットアップとティアダウンの操作が必要になります。
役立つ書籍の1つは、高度なUnixプログラミング、第2版マーク・ロックキンド;必要なレベルでの端末処理をカバーしています。または、<=>を適切に使用できます。これは、独自のソリューションよりも簡単で、おそらくより信頼性が高くなります。
他のヒント
展示していません
#include <stdio.h>
または
#include <curses.h>
または同様の行。 インクルード getch()
するライブラリに対してリンクしていると確信していますか?
たとえば、cin.get()関数を使用します。
#include <iostream>
using namespace std;
int main()
{
char input = cin.get();
cout << "You Pressed: " << input;
}
プログラムは、ユーザーがキーを押すのを待ちます。
一度、キーを押すと画面に印刷されます。
getch
関数はUnixライクなシステムでは使用できませんが、system
関数を使用してコンパイラーからコンソールコマンドに置き換えることができます。
使用法:
Windowsでは、system("pause");
Unixライクシステム(OSXなど)では、system("read -n1 -p ' ' key");
注:<stdlib.h>
は<=>で宣言されています。