2014-01-16 66 views
1

問題是當它要求用戶輸入band的名稱時。程序繞過第一個fgets,但執行printf而不是fgets。我試圖解決這個問題,但如果再次出現同樣的問題。繞過第一個fgets。我也爲你提供一張圖片。程序跳過第一個fgets

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

struct cd 
{ 
    char band[100]; 
}; 

struct cd *music; 

int main() 
{ 
    int n,i; 
    printf("Give how many albums you want: "); 
    scanf("%d",&n); 
    struct cd *music = malloc(sizeof(struct cd)*n); 

    for(i=0;i<n;i++) 
    { 

    printf("\nEnter Band: "); 
    fgets(music->band,sizeof(music->band),stdin); 
    music++; 
    } 

    for(i=n-1;i>=0;i--) 
    music--; 
    for(i=0;i<n;i++) 
    { 
    printf("\nBand: %s",music->band); 
    music++; 
    } 

    printf("\n\n"); 
    return 0; 
} 

enter image description here

+3

這是由於'scanf'('scanf'讀取數字,離開換行符,換行符被'fgets'拾取)之後排隊的'\ n'。 – user2802841

+0

感謝您向我展示問題出在哪裏。 – valkon

+1

不要將'scanf()'與'fgets()'混合使用。最好使用'fgets()/ sscanf()'組合。 – chux

回答

2
當你的scanf(讀)當您嘗試使用與fgets(讀取讀取一切從年底 留下以下「\ n」和現在

),它讀取「\ n '字符左邊掃描f

爲了解決這個問題,你可以使用fgetc(stdin);在你的scanf之後,它會被消耗掉。

+0

是的,這是它。非常感謝! – valkon

+3

如果你在數字後面輸入了一個額外的空格,那麼這將不起作用。要跳到行尾,可以調用'fgets()'並忽略結果,或者編寫一個顯式循環來調用'fgetc(stdin)'直到它返回''\ n''或'EOF'(無論輸入線的長度如何,循環都可以工作)。或者,首先執行'fgets()',然後使用'sscanf()'來解析這行。 –

4

Scanf()將'\ n'視爲一個字符,並且由於它不在格式字符串中,所以它將它保留在那裏。

試試這個

char newline; 
int n,i; 
printf("Give how many albums you want: "); 
scanf("%d%c",&n,&newline); 

這會從標準輸入刪除 '\ n'。

+0

考慮:'「* c」'避免了'newline'的需要。 – chux