2016-02-28 44 views
-5
printf("Give name: "); 
fgets(name, 50, stdin); 
printf("Give surname: "); 
fgets(surname, 50, stdin); 

所有這一切都是在一個循環及以後的第一次,它打印命令給名字,那麼完全跳過它,並打印命令給姓。循環是無止境的,而(在我的代碼它與斷裂出來;和一小會兒後,結束):2與fgets一前一後,第一個被後第一時間跳過

while (1) { 
    printf("Give name : "); 
    fgets(name, 50, stdin); 
    printf("Give surname: "); 
    fgets(surname, 50, stdin); 
    printf("Give ID: "); 
    scanf("%d", &ID); 
} 

而且namesurname是數組。爲什麼跳過第一個名字?

編輯:

你是對的。下面我有一個scanf他們的ID號碼,完全忘了用getchar擺脫\n這個角色。感謝您的快速回復。

+2

你在幹什麼* *前的循環?您是否在使用例如'scanf'讀取其他一些輸入? –

+1

最有可能的原因是,您的實際循環包含更多未在此處發佈的代碼。請僅發佈您測試過的代碼。 – interjay

+4

歡迎來到Stack Overflow!你介意創建一個[___MCVE___](http://stackoverflow.com/help/mcve)? –

回答

2

發佈似乎並不存在重大問題的代碼,但是有問題:

  • scanf("%d", &ID);的調用,爲你不檢查的成功,葉stdin掛起換行。
  • 您不測試fgets()的返回值。它在文件結尾處返回NULL。如果你不休息的話,你會得到一個無限循環。
  • 您的C庫可能無法清除輸出之前stdinfgets()。這可以解釋這種行爲。加入fflush(stdout);呼籲解決這個問題:

    for (;;) { 
        printf("Give name : "); 
        fflush(stdout); 
        if (!fgets(name, 50, stdin)) 
         break; 
        printf("Give surname: "); 
        fflush(stdout); 
        if (!fgets(surname, 50, stdin)) 
         break; 
        printf("Give ID: "); 
        fflush(stdout); 
        if (scanf("%d", &ID) != 1) 
         break; 
        scanf("%*[^\n]"); /* consume extra characters on line, if any */ 
        scanf("%*c");  /* consume the linefeed */ 
    }