我有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$

您可以看到firstfgets()并没有等待来自键盘的字符串输入。
我确信这是因为fgets()取的是输入缓冲区中的\n,在我给出卷号并按下ENTER之后。
当我尝试使用scanf(在上面的代码中注释掉)而不是fgets时,它工作得很好。但是我想使用fgets(),而不是scanf()
昨天从键盘(%c)获取字符时发生了类似的事情,在这种情况下,我可以给一个%c(在%c之前加一个空格)使scanf()忽略\n。我们讨论了这个问题。
但是,我不能对fgets()执行类似的操作,因为我没有指定%s。(而且,令人惊讶的是,我不需要在%s之前为scanf()留出空间,我最初认为我需要这样做)。

最佳答案

好吧,原来的想法似乎行不通,所以再试试:

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

关于c - 如何使fgets()开始时忽略\n?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28485854/

10-15 06:56