kbhit() как escape-триггер

Я хочу использовать kbhit() для функции "Нажмите любую клавишу для продолжения". Однако после того, как я использовал kbhit() в цикле, нажатие клавиши сохраняется в stdin. Таким образом, в следующем scanf(), нажатие кнопки ранее, появляется на входе.

int x,b=0;    
printf("Press any key to continue...")
while (b==0) {

    b=kbhit();

    }
system("cls");

printf("Enter number:");

scanf("%d",&x);

Таким образом, если пользователь нажал клавишу, скажем, букву K, k появляется после "Введите число:".

Я пытался найти решения, но не смог заставить их работать. Я попытался поместить символ возврата в поток ввода. Я также попытался использовать getch(), однако, чтобы продолжить, пользователь должен нажать "Enter", чтобы это не соответствовало первоначальной цели. Я также попытался очистить поток stdin, закрыв и открыв, но не могу открыть его должным образом.

РЕДАКТИРОВАТЬ: Как сказал Янис в комментариях, все, что мне нужно, это использовать систему ("пауза"). Хотя я не могу редактировать. Как сказал Яниш в комментариях, все, что мне нужно, это использовать систему ("пауза"). Хотя я не могу редактировать "Нажмите любую клавишу, чтобы продолжить", этого достаточно для моей цели. Я продолжу пробовать другие решения, представленные здесь, для лучших результатов, если это возможно, но сейчас система ("пауза") - это то, что мне нужно.

EDIT2: Хорошо, некоторые из вас предложили использовать getch(). Из того, что я видел в сети, функция getch () получает входные данные из потока без отображения на экране символа, что я и хочу. Однако, когда я попытался использовать getch(), программа не продолжает работу после нажатия какой-либо клавиши, она ждет, пока я нажму клавишу ввода. Есть проблема? Я использую C-Free 4 Standard на Windows 7.

7 ответов

kbhit() возвращает целочисленное значение, указывающее, нажал ли пользователь клавишу или нет. Обратите внимание, что нажатая клавиша все еще остается в буфере. Все, что вам нужно сделать, это очистить буфер stdin с помощью оператора fflush(stdin).

Однако, если вы хотите использовать клавишу, нажатую пользователем, вы должны будете использовать оператор getch() или scanf после того, как вы использовали kbhit().

Вы можете прочитать хорошую статью "Как использовать kbhit в C и C++" здесь для точных инструкций по использованию.

      #include <windows.h>`#include <windows.h>
#include <stdio.h>
#include <conio.h>      // for kbhit() only
#include <stdbool.h>    // for booleans

void cleaningBuffers()
{
    fflush(stdout);                         // always ok & need!
    while (kbhit()) getch();                // clear buffer
    if ( fflush(stdin) == 0 ) {;}           // undefined, not enough
    // flush the bios kb buffer:
    if ( fflush(__iob_func()) ==  0) {;}    // now ok
}

и консольные буферы чистые ...

См. http://support.microsoft.com/kb/43993, вставьте этот код после того, как прочитаете нужный символ:

while (kbhit()) getch();         //clear buffer
fflush (stdin) ;         // clear stdin's buffer

вам нужно очистить буфер bios kb и стандартный ввод.

Вы должны рассмотреть возможность очистки входного потока после нажатия клавиши

int x,b=0;    
printf("Press any key to continue...")
for(;;){
    if(kbhit()){
       fflush(stdin);
       break;
    }
}
system("cls");

printf("Enter number:");

scanf("%d",&x);

Теперь ваша переменная x чистая и красивая:)

Попробуй это

while(!kbhit());
getch();

kbhit() находится в conio.h, это консольная функция. Это не будет зависеть от повторения (но fflush будут!). Таким образом, чтобы "съесть" нажатую клавишу, вы должны использовать getch(), который также является консольной функцией. В качестве дополнительного бонуса он съест только одного персонажа, а не всех.

Редактировать: только перечитывая ваш вопрос, я задаюсь вопросом: почему бы не использовать getch() Просто так? kbhit() бесполезен, если вы не делаете что-то в цикле.

Кроме того, POSIX-совместимые имена функций будут _getch() а также _kbhit() (по крайней мере, на планете Microsoft).

Вы можете использовать getchar()... он будет сканировать, а также отображать на экране

Другие вопросы по тегам