2012-02-29 12 views
-1

私はスペースキーを押して、whileループから飛び出したいと思っています。例えばCのキーストロークでwhileループを終了するにはどうすればよいですか?

while (some condition) 

{ 

printf ("Press space bar to continue..."); 

} 

感謝!!

+4

は、プラットフォーム固有のコードを必要としますが、言われていませんあなたが使っているプラ​​ットフォームは何ですか?読み込みをブロックするかどうか、ユーザーがキーを押すのを待つか、コードを実行したい、キーストロークを今すぐ確認する、そしてそのループを終了するユーザーはキーを押しますか? –

+0

申し訳ありませんが、そのlinux。実際にキーを入力してもOKです – eastboundr

+0

コンソールまたはウィンドウ(GUI)アプリケーションをビルドしていますか? – Vyktor

答えて

3

できる状態では、xを設定することを置きますあなたのコメントを与えてください。

char input = 0; 
while(input != ' ') 
{ 
    printf("Press space bar to continue...\n"); 
    scanf("%c",&input); 
} 

それとも、エンターキー押すことなく、好む場合:

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    char input = 0; 
    while(input != ' ') 
    { 
    printf("Press space bar to continue...\n"); 
    input = getch(); 
    } 
} 

これは私msysgit bashシェルに取り組みました。しかし、Linux上でも動作すると主張する人もいます。 Linuxは大好きですが、上記の解決方法はmsysgitになりました。次のことは私のことですが、具体的に言えば、Oracle VM for Ubuntu 10.10です。

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

int main(int argc, char **argv) 
{ 
    char input = 0; 
    while(input != ' ') 
    { 
    printf("Press space bar to continue...\n"); 
    input = mygetch(); 
    } 
} 

int mygetch(void) 
{ 
    struct termios oldt, newt; 
    int ch; 
    tcgetattr(STDIN_FILENO, &oldt); 
    newt = oldt; 
    newt.c_lflag &= ~(ICANON | ECHO); 
    tcsetattr(STDIN_FILENO, TCSANOW, &newt); 
    ch = getchar(); 
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt); 
    return ch; 
} 

mygetchhereです。

+0

これは動作しません...スペースキーとそれに続くEnterキーが必要です。 –

+0

助けてくれてありがとう、しかしコードはコンパイルされません – eastboundr

+0

"%c"のように思えます – eastboundr

-2

、変数x = 1を作る彼らはスペースバーを押したときに、私はあなたがいる限り、Enterキーに続いて、スペースバーが許容されるよう、以下の意味だと思う2.

+0

しかし、どのようにキーストロークをキャッチしますか?ありがとう – eastboundr

+1

@eastboundrこれは、あなたが尋ねた質問とはまったく異なる質問です。この回答のコメントは、あなたがそれを求めるべき場所ではありません。 – meagar

+0

-1、ありますか?これは役立ち、妥当な答えです。 – macduff

1

ほとんどのプラットフォームでキーストロークをキャプチャするには、コンソールに直接アクセスする必要があります。典型的には、それを手助けするライブラリがあります。低レベルのライブラリはtermcap(端末機能から得られる)ライブラリです。 termcapの上にcursesという "portable"レイヤーがあります。 Linuxはncursesと呼ばれるGNUバージョンを使用しており、実際には多数のプラットフォームで利用できます。

呪いが広範囲に文書化されて、あなたは

$ man ncurses 

を使用してチュートリアルを開始することができますあなたの問題は、コンソールを初期化し、キ​​ーストロークリーダーをセットアップする手順が必要です。あなたの望む効果を達成するにはいくつかの方法があります。

あなたが遊ぶための実例を投稿しています。これは、呪いにいくつかの基本的な考え方を示しています

/* file: curses_ex1.c */ 

#include <stdio.h> 
#include <curses.h> 

const char rotary[4] = "/-\\|"; 
int main() { 
    WINDOW *w; 
    int i = 0; 
    w = initscr(); 
    if (w == NULL) { 
     return -1; /* unable to initialize curses */ 
    } 
    timeout(500); /* do not block */ 
    mvprintw(0, 0, "Press space bar to break out of the loop."); 
    noecho(); 
    for(i = 0; ; i++) { /* no condition so loops forever */ 
     int c; 
     mvaddch(0, 42, rotary[i%4]); /* display rotator */ 
     c = getch(); /* get a character */ 
     if (c == ' ') 
      break; 
     if (c != ERR) { /* not a space but another valid key */ 
      mvprintw(1, 0, "You need to press a space for me to stop (you pressed `%c')", c); 
     } 
    } 
    endwin(); 
    return 0; 
} 

それをコンパイルするには:(リターンキーなどのない)単一のキーストロークを読む

cc -o curses_ex1 curses_ex1.c -lcurses 
関連する問題