kbhit()作为转义触发器

时间:2012-12-02 14:15:34

标签: c windows kbhit

我想使用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流,但我无法正常打开它。

编辑:正如janisz在评论中所说,我所需要的只是使用系统(“暂停”)。虽然我无法编辑正如janisz在评论中所说的那样,我所需要的只是使用系统(“暂停”)。虽然我无法编辑“按任意键继续”,但它足以满足我的目的。如果可能的话,我会继续尝试这里提供的其他解决方案以获得更好的结果,但是现在,系统(“暂停”)是我想要的。

EDIT2:好的,有些人建议使用getch()。从我在网上看到的,getch()函数从流中获取输入而没有实际显示在屏幕上的char,这就是我想要的。但是,当我尝试使用getch()时,按下任意键后程序不会继续,它等待我按下回车键。有问题吗?我在Windows 7上使用C-Free 4 Standard。

7 个答案:

答案 0 :(得分:2)

kbhit()返回一个整数值,指示用户是否按下了某个键。请注意,按下的键仍保留在缓冲区中。您所要做的就是使用fflush(stdin)语句刷新stdin缓冲区。

但是,如果要使用用户按下的键,则必须在使用kbhit()后使用getch()或scanf语句。

您可以在"How to use kbhit in C and C++" here上阅读有关确切使用说明的好文章。

答案 1 :(得分:1)

http://support.microsoft.com/kb/43993 实质上,在您阅读所需字符后插入此代码:

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

你需要刷新bios kb缓冲区和stdin。

答案 2 :(得分:1)

#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
}

并且控制台缓冲区很清楚...

答案 3 :(得分: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);

现在你的 x 变量很干净漂亮:)

答案 4 :(得分:0)

kbhit()位于 conio.h 中,它是一个控制台功能。它不受影响(但fflush会!)。因此,要“按下”按下的键,你应该使用getch(),这也是一个控制台功能。作为额外的奖励,它只能吃掉一个角色,而不是全部。

修改:只有在重新阅读您的问题时,我才会想:为什么不这样使用getch()?除非你在循环中做某事,否则kbhit()是没用的。

此外,符合POSIX的函数名称将是_getch()_kbhit()(至少在微软行星上)。

答案 5 :(得分:0)

试试这个

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

答案 6 :(得分:-1)

你可以使用getchar()......它会扫描并在屏幕上显示