使用gets函数输入

在下面代码当我想输入第二个学生或> 2个学生的记录时..编译器跳过名称输入并输入课程和年龄的输入..有什么问题请帮助我?

#include  #include  struct Student { char Name[16]; char Class[16]; int age ; }; void main() { struct Student a[5] ; for(int i=0 ; i<5 ; i++) { printf("\n Enter Name :"); gets(a[i].Name); printf("\n Enter Class :"); gets(a[i].Class); printf("\n Enter Age : "); scanf("%d" , & a[i].age); } getch(); } 

问题很常见。 试试这个:

 scanf("%d ", &a[i].age); ^ <--- This space will make scanf eat the remaining blanks 

有关于此的C常见问题解答:

  • Scanf交错
  • Scanf问题
  • 冲洗stdin

次要说明:

  • 不要使用gets 。 请改用fgets

首先,永远不要使用gets 。 没有办法告诉它你的缓冲区有多大,所以它会愉快地在末尾写入输入并使程序爆炸。 这曾经是网络服务器中可远程利用的安全漏洞的首要原因。

第二关, 也不要使用任何*scanf函数 ,因为:

  1. 一些scanf格式字符串与gets一样不安全,特别是没有大小修饰符的%s
  2. scanf数字溢出会引发未定义的行为,这意味着您的程序可能会因为某人输入的数字太大而崩溃。
  3. 使用scanf编写一个健壮的输入解析器是非常困难的,因为如果它失败了,它就不能准确地告诉你问题字符的位置。

对于像这样的简单任务,你应该使用fgets (或者更好的是getline如果你有的话)并将年龄转换为带strtoul的整数。 (年龄不能为负,所以你想要未签名的版本。不要使用atoi和朋友 – 就像*scanf ,他们没有给你足够的关于无效输入的信息。)

对于更复杂的任务,您应该达到lexyacc

这是scanf 。 在它之后按ENTER时,换行符完成下一次get调用。

要解决此问题,您可以在scanf之后的循环结束时添加一个getchar ,它将使用换行符。

 for(int i=0 ; i<5 ; i++) { printf("\n Enter Name :"); gets(a[i].Name); printf("\n Enter Class :"); gets(a[i].Class); printf("\n Enter Age : "); scanf("%d" , & a[i].age); getchar(); }