2

我想将 kbhit() 用于“按任意键继续”功能。但是,在我循环使用 kbhit() 之后,按键存储在标准输入中。因此,在下一个 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”才能继续,所以它违背了最初的目的。我还尝试通过关闭和打开来清除标准输入流,但我无法正常打开它。

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

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

4

7 回答 7

2

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

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

您可以在此处阅读一篇关于“如何在 C 和 C++ 中使用 kbhit”的好文章以获取确切的使用说明。

于 2013-01-05T02:59:29.303 回答
1

基本上看http://support.microsoft.com/kb/43993 ,在你读到你想要的字符后插入这个代码:

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

您需要刷新 bios kb 缓冲区和标准输入。

于 2013-01-03T17:24:56.377 回答
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
}

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

于 2021-05-04T10:14:19.367 回答
0

尝试这个

while(!kbhit());
getch();
于 2012-12-02T15:28:41.560 回答
0

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

编辑:只有在重读您的问题时,我才想知道:为什么不getch()这样使用?是没用的kbhit(),除非你在循环中做一些事情。

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

于 2012-12-02T15:13:46.583 回答
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变量干净漂亮:)

于 2012-12-02T14:58:02.833 回答
-1

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

于 2013-12-30T12:12:22.303 回答