如何使fgets()在开始时忽略\ n?

时间:2015-02-12 19:13:27

标签: c string scanf fgets

我有以下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()在我给出滚动号并按下\n之后正在输入缓冲区中的ENTER

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

昨天从键盘(%c)获取角色时发生了类似这样的事情,在这种情况下,我可以提供%c%c之前的空格)来{ {1}}忽略scanf()。讨论了这个问题here

但是,由于我没有指定(%s),我无法使用\n做类似的事情。 (另外,令人惊讶的是我没有在fgets()的%s之前给出一个空格,我最初认为我需要这样做。

1 个答案:

答案 0 :(得分:0)

好吧,最初的想法似乎不起作用,所以另一个尝试:

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);