如何让 fgets() 忽略开头的 \n?

How to make fgets() ignore a \n at beginning?

我有以下 C 代码。

struct student
{
    int rollNumber;
    char name[20];
    char department[20];
    char course[20];
    int yearOfJoining;
};

int main()
{
    // Creating a 'student' variable.
    struct student s;

    // Take the info of student from keyboard

            printf("Student \n-------------------\n");
            printf("Roll no: ");
            scanf("%d",&s.rollNumber);
            printf("Name: ");
            fgets(s.name, 20, stdin);
            //scanf("%s",&s.name);
            printf("Department: ");
            fgets(s.department, 20, stdin);
            //scanf("%s",&s.department);
            printf("Course: ");
            fgets(s.course, 20, stdin);
            //scanf("%s",&s.course);
            printf("Year of joining: ");
            scanf("%d",&s.yearOfJoining);

   return 0;
}

然而,当我编译 运行 下面的代码时会发生。

-bash-4.1$ ./a.out
Student
-------------------
Roll no: 1
Name: Department: ECE
Course: CE
Year of joining: 2006
-bash-4.1$

可以看到第一个fgets()没有等待键盘输入的字符串。

我确定这是因为 fgets() 在我给出卷号并按下 ENTER 后正在使用输入缓冲区中的 \n

当我尝试使用 scanf(在上面的代码中被注释掉)而不是 fgets 时,它工作正常。但是我想使用 fgets(),而不是 scanf()

昨天我从键盘 (%c) 获取一个字符时发生了这样的事情,在这种情况下我可以给出一个 %c (在 [=20 之前有一个 space =]) 使 scanf() 忽略 \n。这个问题已经讨论

但是,我不能用 fgets() 做类似的事情,因为我没有指定 (%s)。 (此外,令人惊讶的是,我不必在 scanf() 的 %s 之前给出 space,我最初认为我需要这样做)。

好的,原来的思路好像不行,再试一次:

scanf("%d",&s.rollNumber);
printf("Name: ");
fgets(s.name, 20, stdin); /* capture the new line */
fgets(s.name, 20, stdin);

最初的想法: 只需告诉 scanf 也捕获换行符:

scanf("%d\n",&s[i].rollNumber);