2013-04-16 283 views
0

代碼如下:如何清除C控制檯應用程序中的鍵盤緩衝區?

#include <stdio.h> 
#include <signal.h> 
#include <stdlib.h> 

#define SIZE 1024 
char buffer[SIZE] = {0}; 

void timeout(int sig); 

int main(void) 
{ 
    signal(SIGALRM, timeout); 
    alarm(3); 

    printf("[Input]: "); 
    fflush(stdout); 

    fgets(buffer, SIZE, stdin); // #1, enter some contents 

    return 0; 
} 

/* if #1 is not over within 3 seconds 
    I want to clear the keyboard buffer filled at #1, and reenter some new contents 
*/ 
void timeout(int sig) 
{ 
    printf("\r      \r[Input]: "); 
    fflush(stdout); 

    // clear the keyboard buffer pressed at #1 
    // ... // how to implement it? 

    fgets(buffer, SIZE, stdin); // #2, reenter some new contents 
    printf("%s", buffer); // I expect it output the contents filled at #2 only, not include that of #1 

    exit(0); 
} 

微軟CSDN說退()函數可以清除鍵盤緩衝區,但我並沒有在Linux上運行。
我看到某處C++標準庫的std :: cin.igore()也可以得到相同的效果。
但是如何在C語言中實現它?

+0

您不應該清除輸入緩衝區。由於某種原因,用戶可能會將數據放入其中。 –

+0

哇!信號處理程序中禁止所有的stdio函數。不要這樣做。 –

回答

0

由於stdin是一個終端,您可以使用tcflush功能。

tcflush(STDIN_FILENO, TCIFLUSH); 

看那man page以包括正確的頭文件。您也可以查看select man page,並停止使用警報。

+0

不在這裏工作。 'scanf'後面跟着'tcflush',接着'fgets'和'fgets'得到'scanf'左邊的'\ n'。 –