fgets()的第一个实例正在被跳过

问题描述:

所以我正在练习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

你必须要小心混合不同的输入方法,如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获得从行中提取数据的能力。