2012-12-02 15 views
2

我想用「按任意鍵繼續」功能使用kbhit()。 但是,在循環中使用了kbhit()之後,按下的鍵存儲在標準輸入中。 因此在下一個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,K出現在「輸入數字:」後面。

我試過尋找解決方案,但未能讓他們中的任何一個工作。 我試圖把退格字符放入輸入流中。 我也嘗試過使用getch(),但是,用戶必須按「Enter」才能繼續,因此它擊敗了原來的目的。 我也嘗試清除標準輸入流,通過關閉和打開,但我無法讓它正常打開。

編輯:正如janisz在評論中所說,我需要的是使用系統(「暫停」)。雖然我無法編輯正如janisz在評論中所說的,我所需要的只是使用系統(「暫停」)。雖然我不能編輯「按任意鍵繼續」,但它足以滿足我的目的。如果可能,我會繼續嘗試其他解決方案以獲得更好的結果,但現在,系統(「暫停」)是我想要的。編輯2:好吧,你們有人建議使用getch()。從我在網上看到的,getch()函數從流中獲取輸入,而不顯示字符實際顯示在屏幕上,這正是我想要的。但是,當我嘗試使用getch()時,按下任意鍵後程序不會繼續,它等待我按下Enter鍵。有問題嗎?我使用的是標準的Windows 7,C-4免費

+1

查找到while循環之後添加調用'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); 

後,現在您X變量是乾淨漂亮:)

+0

它沒有區別。在按下按鍵時仍然會出現在scanf –

+0

的默認位置,您可以嘗試讀取切換kbhit()並忽略它的字符。這是一個解決方案,因爲總會有一個字符被忽略,但這是'非常糟糕的風格' –

0

kbhit()conio.h,它是一個控制檯功能。它不會受到重寫的影響(但是fflush會!)。因此,要「按下」按鍵,您應該使用getch(),這也是一個控制檯功能。作爲額外的獎勵,它只會吃掉一個角色,而不是全部。

編輯:只有在重讀您的問題我想知道:爲什麼不使用getch()就是這樣? kbhit()是無用的,除非你在循環中做一些事情。

此外,符合POSIX的函數名稱將是_getch()_kbhit()(至少在微軟行星上)。

0

試試這個

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

看到http://support.microsoft.com/kb/43993 基本上,你看你想要的字符後插入此代碼:

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

你需要來刷新BIOS KB緩衝區和標準輸入。

2

kbhit()返回一個整數值,指示用戶是否按下了某個鍵。請注意,按下的按鍵仍然保留在緩衝區中。你所要做的就是使用fflush(stdin)語句來刷新stdin緩衝區。

但是,如果您要使用用戶按下的鍵,則必須在使用kbhit()後使用getch()或scanf語句。

有關確切的使用說明,您可以閱讀"How to use kbhit in C and C++" here的好文章。

-1

u可以使用的getchar()......它會掃描並顯示在屏幕上

+0

這並不回答OP的問題,因爲他不想顯示。 – arne