2016-08-04 278 views
4
#include <stdio.h> 
int main() 
{ 
    char name[10]; 
    for(int i=0;i<=10;i++) 
    { 
    printf("Who are you? "); 
    if(fgets(name,10,stdin)!=NULL) 
    printf("Glad to meet you, %s.\n",name); 
    } 
    return(0); 
} 

當我輸入大於10個字符的東西時,循環跳過。在C中的fgets()後清空輸入緩衝區

Who are you? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaaaa. 
Who are you? Glad to meet you, aaaaaaa 

我想我想從其餘字符清除輸入緩衝區。什麼是最好的方式來做到這一點...?

回答

5

檢查是否存在換行name

#include <stdio.h> 
#include <string.h> 

int main(void){ 
    char name[10]; 

    for(int i=0;i<=10;i++){ 
     printf("Who are you? "); 
     if(fgets(name,10,stdin)){ 
      char *p; 
      if(p=strchr(name, '\n')){//check exist newline 
       *p = 0; 
      } else { 
       scanf("%*[^\n]");scanf("%*c");//clear upto newline 
      } 
      printf("Glad to meet you, %s.\n", name); 
     } 
    } 
    return(0);//Parentheses is not necessary 
} 
+1

用好scanf函數的'(「%* [^ \ n]」)長度的字符; scanf函數(「% *');''而不是不正確的'scanf(「%* [^ \ n]%* c」);' – chux

1

從文檔fgets(重點煤礦):

讀取來自流的字符,並將它們存儲爲C字符串到STR 直到(NUM-1)的字符已被讀出或任一換行或 已到達文件結尾,以先發生者爲準

因此,您的輸入(超過緩衝區)以9個字符(+1 null-terminating char)的塊讀取。

您需要反覆調用fgets,直到最後一個讀取的字符爲換行符(\ n)。

+0

的問題是喜歡它將使到達時,等待在限制進入.. – Nikhil

1

你需要尋找使用類似下面這樣的\n

/* flush unread input buffer */ 
while(! strchr(name, '\n')) 
    if(! fgets(name,(sizeof name),stdin)) 
     break; 

注:不知道你是否認爲這是一個錯誤或特性,但是短名稱將包括最終\n。結果如下:

Glad to meet you SSS 
. 
+0

這是一個好主意,除了額外調用'fgets()'會更好IMO),使用不同於'name []'的緩衝區。 OTOH @Nikhil George在這種情況下並不清楚名稱[]的內容。 – chux

2

檢查fgets()是否獲得了'\n'。如果沒有'\n',則當前行中的某些字符尚未被讀取。你可以簡單地忽略它們。

printf("Who are you? "); 
    if (fgets(name, 10, stdin) != NULL) { 
     if (!strchr(name, '\n')) { 
      // consume rest of chars up to '\n' 
      int ch; 
      while (((ch = getchar()) != EOF) && (ch != '\n')) /* void */; 
      if (ch == EOF) /* input error */; 
      printf("Glad to meet you, %s.\n", name); 
     } else { 
      printf("Glad to meet you, %s.", name); // name includes ENTER 
     } 
    } 
+0

不清楚爲什麼'if(ch == EOF)'被認爲是一個錯誤,因爲它可能很簡單就是'stdin'被關閉了。 (例如,重定向輸入:'program_foo chux

+1

@chux:你可以檢查'ferror()'和/或'feof()'以確保。對我來說,一行包含了ENTER。如果文件中的最後一個字符不是「\ n」,那麼該文件將以非線條結束。 – pmg