2014-01-09 84 views
0

我想編寫一個函數來讀取stdin中的數據。該功能將被其他功能調用以提示用戶輸入數據。丟棄標準輸入流緩衝區中的無關字符

void read_data(void) { 
    // prompt the user by printing a message 
    // printf("enter data:\n"); 

    int a; 
    char name[40]; 
    scanf("%d", &a); 

    // prompt for input again 

    scanf("%39[^\n]", name); 

    // do something with the data 
} 

爲了使功能read_data正常工作,不應該有在stdin流緩存器的任何多餘的字符,即,它應該是空的。該函數不知道在最後一次調用中輸入了什麼,並且輸入緩衝區中可能存在整數和字符。

如何確保函數read_data正常工作?

+0

只需使用'fgets()'並逐行讀取輸入。比scanf()好得多(包括安全!)。 – 2014-01-09 17:44:12

+0

以後不會調用'fgets()'會遇到同樣的問題嗎?如果輸入字符串比我們傳遞給'fgets'的緩衝區長?接下來'fgets'調用將從'stdin'緩衝區開始讀取。 – ajay

+1

'fgets()'吃掉所有尾隨的換行符。如果你傳遞了一個尺寸爲'LINE_MAX'的雜物,那麼它就能保持任何一行。 – 2014-01-09 18:30:03

回答

1
void read_data(void) { 

// prompt the user by printing a message 
// printf("enter data:\n"); 

int a,c; 
char name[40]; 
scanf("%d", &a); 
while((c=getchar()) != '\n'); 
// prompt for input again 

scanf("%39[^\n]", name); 
while((c=getchar()) != '\n'); 
// do something with the data 
} 

使用與

while((c=getchar()) != ' ' && c != '\t' && c != '\n'); 

第一scanf函數因此,如果給定的字符是「\ n」,那麼getchar函數獲得字符,並檢查它是否是新行,如果它是新行,如果轉會還有一點,它會到達換行符,因此stdin流緩衝區被清除。

+0

如果在沒有提示用戶輸入的情況下存在非空白字符,則第一個'scanf'調用將靜默地從緩衝區中讀取。 – ajay

+0

在第一個scanf函數下使用下面的代碼。 – Chandru

+0

以及如果輸入緩衝區爲空?然後你必須輸入一個空白字符才能退出while循環。 – ajay