使用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
函数 ,因为:
- 一些
scanf
格式字符串与gets
一样不安全,特别是没有大小修饰符的%s
。 -
scanf
数字溢出会引发未定义的行为,这意味着您的程序可能会因为某人输入的数字太大而崩溃。 - 使用
scanf
编写一个健壮的输入解析器是非常困难的,因为如果它失败了,它就不能准确地告诉你问题字符的位置。
对于像这样的简单任务,你应该使用fgets
(或者更好的是getline
如果你有的话)并将年龄转换为带strtoul
的整数。 (年龄不能为负,所以你想要未签名的版本。不要使用atoi
和朋友 – 就像*scanf
,他们没有给你足够的关于无效输入的信息。)
对于更复杂的任务,您应该达到lex
和yacc
。
这是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(); }