在下面的代码中,当我想输入第二个学生或>2个学生的记录时..编译器跳过名称输入,并接受类和年龄的输入。有什么问题,请帮帮我?
#include <stdio.h>
#include <conio.h>
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();
}发布于 2012-02-04 03:18:09
这个问题很常见。试试这个:
scanf("%d ", &a[i].age);
^ <--- This space will make scanf eat the remaining blanks关于这一点,有几个常见问题:
次要注释:
fgets。发布于 2012-02-04 03:33:46
首先,永远不要使用gets。没有办法告诉它你的缓冲区有多大,所以它会兴高采烈地在结束后写入输入,并使程序崩溃。这曾经是网络服务器中可被远程利用的安全漏洞的头号原因。
其次,也不要使用任何*scanf函数,因为:
scanf格式的字符串与gets一样不安全,特别是在scanf内没有大小溢出的%s会引发未定义的行为,这意味着您的程序可能会因为某人键入的数字太大而崩溃。scanf编写健壮的输入解析器非常困难,因为如果失败,它不会告诉您问题字符的确切位置。对于像这样的简单任务,您应该使用fgets (或者,如果有的话,最好使用getline ),并使用strtoul将年龄转换为整数。(年龄不能为负数,因此您需要无符号版本。不要使用atoi和朋友-就像*scanf一样,他们不会给你提供关于无效输入的足够信息。)
对于更复杂的任务,你应该使用lex和yacc。
发布于 2012-02-04 03:23:12
是scanf。在此之后按ENTER时,换行符将完成对gets的下一次调用。
要解决这个问题,可以在循环末尾的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();
}https://stackoverflow.com/questions/9134208
复制相似问题