我有以下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之前给出一个空格,我最初认为我需要这样做。
答案 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);