В C, как я могу постоянно получать пользовательский ввод при выполнении другой функции? - PullRequest
3 голосов
/ 25 октября 2011

Эта проблема действительно беспокоит меня о том, как сделать это на C:

Отображение серии чисел (1,2,3,4, 5 .... и т. Д.) В бесконечном цикле. Программа должна завершиться, если кто-то нажмет определенную клавишу (скажем, клавишу Backspace).

Моя попытка состояла в том, чтобы сделать цикл, а затем каждый раз получать пользовательский ввод.

int main()
{
    char userInput;
    int i = 0;

    while(true)
    {
       Sleep(1000);
       printf("%d", ++i);
       userInput = getch();
       fflush(stdin);

       if (userInput == '\b'){
        break;   
       }           
    }

    getch();
    return 0;

}

Но это не тот ответ, который ищет проблема. Он хочет продолжить печать номеров при проверке пользовательского ввода.

Кто-нибудь может помочь новичку с этим? Спасибо! : D

Обновление: Мистер Марк Уилкинс только что дал мне ответ с помощью функции _kbhit (). И вот как выглядело мое решение:

int main()
{
    int i = 0;
    char userInput;

    while( !_kbhit() && userInput != '\b' )
    {
       Sleep(500);
       printf("%d", ++i);    
    }

    getche();

    getch();
    return 0;

}

Ответы [ 4 ]

3 голосов
/ 25 октября 2011

Вы можете позвонить _kbhit, чтобы проверить, ждет ли ввод. Если есть, то вы можете прочитать это с _getch.

1 голос
/ 25 октября 2011

Короткий ответ : Вы не можете, если хотите, чтобы ваша программа была переносимой.

Длинный ответ : Нет портативного способа «слушать»для нажатия клавиш в стандартном C или C ++ в этом отношении.Для этого вам придется использовать библиотеки, специфичные для операционной системы.

Кстати, поскольку вы используете getch (), я предполагаю, что вы используете древний DOS-компилятор из до 1989 эпоха.Плохая, плохая идея.Если только вы не используете Curses в UNIX, который обеспечивает реализацию getch ().

Я предполагаю, что источник этого вопроса программирования также древний.Используйте современный , соответствующий стандартам компилятор, такой как gcc / g ++ или MSVC.: -)

Если вы только начинаете программировать, придерживайтесь стандартов, не используйте специфичный для платформы код.

1 голос
/ 25 октября 2011

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

http://www.albahari.com/threading/

Создайте логическое значение, которое изначально истинно.Когда пользователь вводит нужный символ, установите для него значение false.Цикл должен быть внутри вашей нити и проверять это логическое значение.Цикл должен завершиться, когда логическое значение установлено в false.

0 голосов
/ 25 октября 2011

kbhit является функцией <conio.h> и представляет собой весьма устаревший способ ведения дел.

http://en.wikipedia.org/wiki/Conio.h

Обратите внимание на замечание, что "Это не описано в книге" Язык программирования C ", и оно не является частью стандартной библиотеки C, ISO C и не требуется POSIX."

Если единственная специальная функция, которую вы хотите использовать в стандартной программе ввода-вывода, - разрешить завершение работы пользователя во время обработки, существует базовое понимание того, что пользователь может сделать это с помощью Ctrl-C:

http://en.wikipedia.org/wiki/Control-C

Если вы хотите сделать что-то более сложное, например, знать, когда пользователь одновременно удерживает две клавиши на клавиатуре (например, клавишу курсора и клавишу, используемую для обозначения стрельбы), вам нужно выкопать крестик. Платформа библиотека какой-то. Спросите среди разработчиков игр:

рекомендация по кроссплатформенному вводу с клавиатуры / мыши

Инструменты разработки в средах с графическим интерфейсом обычно основаны на цикле событий и, как правило, предлагают такие события, как «keydown» и «keyup», которые вы можете отслеживать, вместо того, чтобы получать только печатаемые символы. С этими событиями вы можете (например), как правило, определить разницу между тем, кто нажимает «1» на цифровой клавиатуре, а не в верхней строке ... или когда левая клавиша управления вместо правой.

...