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

fgets()'s first instance is being skipped

所以我正在练习 c,并且在使用 fgets() 时遇到了这个错误。代码的第一个实例被跳过并转到下一行。

代码

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)

您必须小心混合不同的输入法,例如 scanffgets。如果你 scanf("%d") 并输入一个整数后跟一个换行符,指针将留在换行符处(第一个字符对构造整数无效),所以 那是 什么如您所见,以下 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;
}

如果你 compile/run 那个,然后输入 123 456,你将看到的输出是:

123[ 456
]

在那里你可以看到 fgets 已经拾取了扫描整数之后的剩余行,从第一个非数字 space 到末尾的换行符。

如果单独使用 scanf,通常没问题,因为 大多数 (但不是全部)格式说明符在读取之前会跳过前导白色 space他们的项目。

还有一些方法允许混合使用不同的输入法,例如读取 scanf 之后的字符直到换行,有效地丢弃该行的其余部分(包括换行符)。

但也许最简单的方法是使用定制的、经过验证的 line-input 函数来获取行,然后 sscanf 行来获取你想要的想要,比如this one.

这样,所有 输入都是基于行的,您仍然可以获得 scanf 从行中提取数据的能力。