getchar() 的具体工作是什么?

What is the exact work, that the getchar() is doing?

在这里,如果我不使用 getchar(),输出就会出现错误:

getchar() 到底在做什么?

在另一个输入被调用之前它持有什么?

在这种情况下如何调用下一个输入?

我的代码:

//To take 3 students data using stucture which is user defined.
#include<stdio.h>
#include<stdlib.h>
//#include<conio.h>
struct student
{
    char reg_number[200];
    char name[200];
    int marks_obt;
};
int main()
{
    struct student stud1,stud2,stud3;
    printf("Enter registration number of student 1 : ");
    gets(stud1.reg_number);
    printf("Enter name of student 1 : ");
    gets(stud1.name);
    printf("Enter marks of student 1 : ");
    scanf("%d",&stud1.marks_obt);
    system("cls");
        //getchar();
    printf("Enter registration number of student 2 : ");
    gets(stud2.reg_number);
    printf("Enter name of student 2 : ");
    gets(stud2.name);
    printf("Enter marks of student 2 : ");
    scanf("%d",&stud2.marks_obt);
    system("cls");
        //getchar();
    printf("Enter registration number of student 3 : ");
    gets(stud3.reg_number);
    printf("Enter name of student 3 : ");
    gets(stud3.name);
    printf("Enter marks of student 3 : ");
    scanf("%d",&stud3.marks_obt);
    system("cls");
    
    printf("ID of student 1 is %s \n Name of student 1 is %s \n Marks obtained by stdent 1 is %d",stud1.reg_number,stud1.name,stud1.marks_obt);
    printf("\n\n");
    printf("ID of student 2 is %s \n Name of student 2 is %s \n Marks obtained by stdent 2 is %d",stud2.reg_number,stud2.name,stud2.marks_obt);
    printf("\n\n");
    printf("ID of student 3 is %s \n Name of student 3 is %s \n Marks obtained by stdent 3 is %d",stud3.reg_number,stud3.name,stud3.marks_obt);
    //getch();
} 

首先,never use the gets()。它已从 C 和 C++ 标准中弃用。安全的方法是应用 fgets():

char input[128];
if (fgets(input, sizeof input, stdin) == NULL) {
  // Oops... input was incorrectly given, handle the error
  return EXIT_FAILURE; // To quit
}

// Removing the trailing newline character
input[strcspn(input, "\n")] = 0;

在下一个 gets() 调用中要求用户输入另一个内容时,您面临重叠,因为您也按下了 Return 键当您用 scanf() 完成输入时。最后添加一个换行键。

getchar() 使用换行符,因此它被丢弃并完成您期望的工作。

已经有评论和正确答案了,应该够了,但从你最后的评论来看,你似乎还没有明白是怎么回事。

这一行:

scanf("%d",&stud1.marks_obt);

解析一个整数,因为你按下 Enter,当你这样做时,一个 \n 被添加到 stdin 缓冲区,并保留在那里, 它不是 scanf解析的。

之后:

gets(stud2.reg_number);

将解析 \n 字符并将其存储在 stud2.reg_number 中,然后程序继续。

当您使用 getchar() 时,它会解析 \n 并再次将 stdin 缓冲区留空,因此 gets 没有任何内容可解析并等待您的输入,纠正问题,它仍然是一个脆弱的解决方案,但它在这种特殊情况下有效。

故事的寓意,至少不要将 scanfgetsfgets 混用,因为如前所述,gets 已从标准中删除C11。一些编译器仍然支持它的原因超出了我的理解。