2017-05-07 9 views
0

私はC++プログラミングの新人で、Macをコンピュータとして使っています。 私はしばらくインターネットの周りを検索してきましたが、私はまだ私の問題のための良い解決策を見つけることができません。OS X - if文のキー押下

キーボードの矢印でプロジェクトを作成していますが、if文でKeypress関数を作成する方法がわかりません。

は、だから私は探しています解決策は次のとおりです。

if (up arrow is pressed) { 
    std::cout << it worked! << std::endl; 
} 

情報: LLVMコンパイラ、Xcodesコマンドラインツール、UNIX、OS X-シエラ は助けてくれてありがとう。

+0

環境について詳しく知る必要があります。これはOS XのGUIアプリケーション、CLIツール、SDLアプリケーションなのですか? –

+0

よろしくお願いします... –

+0

スクリーンコントロールに 'curses'を使用していますか?もしそうなら、答えは 'curses'のためのドキュメントにあります。そうでない場合は、答えは難しいhttp://c-faq.com/osdep/cbreak.html –

答えて

1

まあ、私はまた、私はまたSierraを実行しているので、何が違うのかわからない、他の答えのコードを得ることができませんでした。しかし、私はそれをtcsetattrを使って変換しました。この呼び出しのポイントは、ターミナルを生モードにして、キーを直接押すようにすることです。あなたがそれをしないと、あなたがenterを押すまで何も送られません。

#include <stdio.h> 
#include <termios.h> 
#include <unistd.h> 

static struct termios savemodes; 
static int havemodes = 0; 

int tty_break(void) 
{ 
    struct termios modmodes; 
    if (tcgetattr(STDIN_FILENO, &savemodes) < 0) 
     return -1; 
    havemodes = 1; 
    modmodes = savemodes; 
    cfmakeraw(&modmodes); 
    return tcsetattr(STDIN_FILENO, TCSANOW, &modmodes); 
} 

int tty_getchar(void) 
{ 
    return getchar(); 
} 

int tty_fix(void) 
{ 
    if(!havemodes) 
     return 0; 
    return tcsetattr(STDIN_FILENO, TCSANOW, &savemodes); 
} 

int 
main(int argc, char *argv[]) 
{ 
    int i; 
    if(tty_break() != 0) 
     return 1; 
    for(i = 0; i < 10; i++) 
     printf(" = %d\n", tty_getchar()); 
    tty_fix(); 
    return 0; 
} 
+0

はい、これは私のSierraでもうまくいきます!私は 'Xcode'を使用しません。おそらくその違いを説明しています - 私はターミナルで' gcc'または 'clang'を使ってコマンドラインコンパイラを使うだけです。共有していただきありがとうございます。 –

0

コードwhich I linked to in the commentsを一緒に1つのプログラムに入れて、どのように動作するかを確認できます。

#include <stdio.h> 
#include <sgtty.h> 

static struct sgttyb savemodes; 
static int havemodes = 0; 

int tty_break() 
{ 
    struct sgttyb modmodes; 
    if(ioctl(fileno(stdin), TIOCGETP, &savemodes) < 0) 
     return -1; 
    havemodes = 1; 
    modmodes = savemodes; 
    modmodes.sg_flags |= CBREAK; 
    return ioctl(fileno(stdin), TIOCSETN, &modmodes); 
} 

int tty_getchar() 
{ 
    return getchar(); 
} 

int tty_fix() 
{ 
    if(!havemodes) 
     return 0; 
    return ioctl(fileno(stdin), TIOCSETN, &savemodes); 
} 

main() 
{ 
    int i; 
    if(tty_break() != 0) 
     return 1; 
    for(i = 0; i < 10; i++) 
     printf(" = %d\n", tty_getchar()); 
    tty_fix(); 
    return 0; 
} 

あなたは単純にそれをコンパイルすることができます

clang main.c -o main 

し、それを実行します。

./main 

あなたは(上矢印)キーは、次のコードを引き起こしていることがわかります:

27 (Escape) 
91 
65 

コードは私のものではないことに注意してください。これは上記のC-FAQから完全に抽出されています。

+1

私はこれがOS X上で動作するとは思わないが、そこにはtcsetattrを使用するべきである。また、K&Rスタイルのコードを使用することはお勧めしません。 –

+0

@PerJohanssonあなたの考えをありがとう。それはSierraの私のコピーで正常に動作します。代替案があるかもしれません - 答えを自由に追加してください - より多くの愉快さ! –

+0

奇妙なことに、シエラも稼働していて、それを動作させることができません。 tcsetattrバージョンをタイプアップしました。 –

関連する問題