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

时间:2015-02-11 01:39:48

标签: c input fgets

所以我练习c并且在使用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)

1 个答案:

答案 0 :(得分:6)

您必须小心混合使用不同的输入方法,例如scanffgets。如果您scanf("%d")并输入一个整数后跟换行符,则指针将保留在换行符处(第一个字符对构造整数无效),所以 后面的内容{正如您所见,{1}}会接听。

例如,请考虑以下小程序:

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行来获取所需内容,例如{ {3}}

这样,所有输入都是基于行的,你仍然可以获得sscanf的强大功能来从行中提取数据。