2012-12-02 5 views
2

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

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

    b=kbhit(); 

    } 
system("cls"); 

printf("Enter number:"); 

scanf("%d",&x); 

Итак, если пользователь нажал клавишу, скажем букву K, после «Enter number:» появится k.

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

EDIT: Как я сказал в комментариях, все, что мне нужно, это использовать систему («пауза»). Хотя я не могу редактировать. Как сказал в комментариях janisz, все, что мне нужно, это использовать систему («пауза»). Хотя я не могу отредактировать «Нажмите любую клавишу, чтобы продолжить», это достаточно для моей цели. Я буду продолжать использовать другие решения, предлагаемые здесь для получения лучших результатов, если это возможно, но на данный момент мне нужна система («пауза»).

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

+1

Посмотрите на добавление вызова в 'fpurge (FILE * поток)' функцию сразу после цикла. _purge_ стирает любые входные или выходные данные, буферизированные в данном потоке. Его можно найти в . – Nocturno

+0

fflush только поток потока потока. Это не сработало для меня. fpurge недоступен, его нет в моем stdio.h. Я думаю, что он доступен только для Linux. –

+1

Вы можете использовать 'system (" pause ");' вместо 'kbhit()' – janisz

ответ

0

вы должны рассмотреть промывке входного потока после того, как клавиша была нажата

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

printf("Enter number:"); 

scanf("%d",&x); 

Теперь ваш х переменная является чистым и довольно :)

+0

Это не имело значения. нажатие клавиши по-прежнему появляется по умолчанию по scanf –

+0

, вы можете попробовать затем прочитать символ, который переключает kbhit() и игнорирует его. это решение, потому что всегда будет один символ игнорировать, но это «очень плохой стиль» –

0

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

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

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

1

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

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

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

2

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

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

Для получения точных инструкций по использованию вы можете прочитать хорошую статью по адресу "How to use kbhit in C and C++" here.

-1

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

+0

Это не отвечает на вопрос OPs, поскольку он не хочет отображать. – arne

Смежные вопросы