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
没有任何内容可解析并等待您的输入,纠正问题,它仍然是一个脆弱的解决方案,但它在这种特殊情况下有效。
故事的寓意,至少不要将 scanf
与 gets
、fgets
混用,因为如前所述,gets
已从标准中删除C11。一些编译器仍然支持它的原因超出了我的理解。
在这里,如果我不使用 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
没有任何内容可解析并等待您的输入,纠正问题,它仍然是一个脆弱的解决方案,但它在这种特殊情况下有效。
故事的寓意,至少不要将 scanf
与 gets
、fgets
混用,因为如前所述,gets
已从标准中删除C11。一些编译器仍然支持它的原因超出了我的理解。