2015-02-11 86 views
1

所以我正在練習c,並且在使用fgets()時得到這個錯誤。代碼的第一個實例被跳過並進入下一行。fgets()的第一個實例正在被跳過

CODE

for(g = 0;g<numStudents;g++) 
    { 
    array->firstName = malloc(sizeof(char)*BUFSIZE); 
    array->lastName = malloc(sizeof(char)*BUFSIZE); 

    printf("Student %d\n", g+1); 
    printf("First Name:"); 
    fgets(array->firstName, BUFSIZE, stdin); 
    printf("Last Name:"); 
    fgets(array->lastName, BUFSIZE, stdin); 
    printf("\n\n"); 
    } 

我用這部分之前的scanf(),所以我發現我必須刷新緩衝區。但是,這是行不通的。

輸出通常會是:

Student 0 
First Name:Last Name:(Cursor) 
+0

'sizeof(char)== 1'並且是強制性的,您可以發佈您的輸入嗎?對於固定大小也使用'malloc()'是沒有必要的。 – 2015-02-11 01:46:07

+1

至少,[scanf()'把''\ n''作爲從前一個'scanf()']遺留下來的輸入的答案(http://stackoverflow.com/questions/1815986/does- scanf-take-n-as-input-left-from-previous-scanf)適用於您的情況。 'scanf()'可能會在'fgets()'讀入的輸入流中留下換行符作爲第一個輸入'行'。我會把它作爲一個副本來處理,但我寧願在使用Mjolnir之前達成一些共識。 – 2015-02-11 01:59:23

+0

'scanf'後你如何刷新緩衝區? – 2015-02-11 02:00:51

回答

6

你必須要小心混合不同的輸入方法,如scanffgets。如您所示,並輸入一個整數後跟一個換行符,指針將保留在換行符處(第一個字符對於構造一個整數無效),因此接下來的fgets將會出現,如您所見。

例如,請考慮以下的小程序:

#include <stdio.h> 
int main (void) { 
    int val; 
    char buffer[100]; 
    scanf ("%d", &val); 
    fgets (buffer, sizeof(buffer), stdin); 
    printf ("%d[%s]\n", val, buffer); 
    return 0; 
} 

如果你編譯/運行,然後輸入123 456,你會看到輸出是:

123[ 456 
] 

那裏你可以看到fgets已從掃描整數後的第一個非數字空格到最後一個換行符處拾取了其餘行。

如果單獨使用scanf,通常可以使用,因爲大多數(但不是全部)格式說明符在讀取它們的項目之前會跳過前導空白。

還有一些方法可以允許混合不同的輸入方法,例如讀取scanf之後的字符,直到獲得換行符,有效地丟棄行的其餘部分(包括換行符)。

但也許是最簡單的方法是使用一個特製的,經過驗證的線路輸入函數獲取行,然後sscanf線得到你想要的東西,如this one

這樣,全部輸入是基於行的,您仍然可以通過scanf獲得從行中提取數據的能力。