Hàm _kbhit() lặp vô hạn

Mình định viết chương trình: cho 1 khoảng thời gian để nhập nếu có 1 phím vừa nhập chương trình sẽ in ra 1 chuỗi “chao ban”, nhập 1 phím chương trình sẽ in 1 lần, nếu không có thì chương trình sẽ kết thúc. Nhưng chương trình mình viết nếu nhấn 1 lần thôi thì sẽ lặp vô hạn. Mọi người giúp mình với.

void main(){

char ch;
do
{
	printf("chao ban");
	Sleep(3000);
	ch = _kbhit();
} while (_kbhit());
_getch();

}

From MDS

The _kbhit function checks the console for a recent keystroke. If the function returns a nonzero value, a keystroke is waiting in the buffer. The program can then call _getch or _getche to get the keystroke.

1 Like

nhầm! lệnh ch=_kbhit(); thật ra k có tác dụng gì
Mình muốn là nhấn 1 phím thì nó in ra 1 lần
nhưng mà mình nhấn 1 phím thì nó in liên tục lun

Nó in liện tục vì _kbhit() luôn trả về giá trị khác 0 sau khi bạn nhấn 1 phím.
Cứ thế vòng lặp sẽ lặp mãi.
Phải dùng _getch hoặc _getche để bỏ đệm _kbhit. Khi đó nó sẽ trả về 0 ở lần gọi sau.

// crt_kbhit.c  
// compile with: /c  
/* This program loops until the user  
 * presses a key. If _kbhit returns nonzero, a  
 * keystroke is waiting in the buffer. The program  
 * can call _getch or _getche to get the keystroke.  
 */  
  
#include <conio.h>  
#include <stdio.h>  
  
int main( void )  
{  
   /* Display message until key is pressed. */  
   while( !_kbhit() )  
      _cputs( "Hit me!! " );  
  
   /* Use _getch to throw key away. */  
   printf( "\nKey struck was '%c'\n", _getch() );  
}  

https://msdn.microsoft.com/en-us/library/58w7c94c.aspx

2 Likes

cảm ơn bạn nhiều!!!

Bạn đọc kĩ đoạn mình bôi đậm nhé

1 Like

À mình hiểu r! cảm ơn bạn <3

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?