Как выйти из цикла while нажатием клавиши в C? - PullRequest
0 голосов
/ 01 марта 2012

Я хочу, чтобы пользователь нажимал клавишу пробела, чтобы выйти из цикла while.

Например:

while ( some condition )

{

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

}

Спасибо !!

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

Я думаю, что вы имеете в виду следующее, если пробел, за которым следует клавиша ввода, допустим, учитывая ваши комментарии выше.

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 для 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;
}

mygetch пришел от сюда .

1 голос
/ 01 марта 2012

Для захвата клавиш на большинстве платформ требуется прямой доступ к консоли. Обычно для этого есть библиотеки. Низкоуровневые библиотеки - это библиотеки termcap (которые получены из возможностей терминала). В верхней части termcap есть «переносимый» слой, называемый curses. Linux использует версию GNU, которая называется ncurses и фактически доступна на множестве платформ.

Curses тщательно документированы, вы можете начать учебник, используя

$ 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
0 голосов
/ 01 марта 2012

Создайте переменную x = 1, поместите ее в условие, когда они нажимают пробел, установите x в 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...