我想使用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。
答案 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()......它会扫描并在屏幕上显示