使用获取功能输入
问题描述:
在下面的代码当我想输入第二个学生或> 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();
}
答
这个问题很普遍。试试这个:
scanf("%d ", &a[i].age);
^<--- This space will make scanf eat the remaining blanks
有是C常见问题解答这个问题:
辅助Notes:
-
Don't use
gets
。改为使用fgets
。
答
这是scanf
。当它后面按ENTER
时,换行符完成下一个呼叫gets
。
若要解决此问题,您可以在循环的末尾添加一个getchar
,在scanf
之后,这将消耗换行符。
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();
}
答
首先,从不使用gets
。无法告诉它缓冲区有多大,因此它会愉快地写入输入,并使程序爆炸。这曾经是网络服务器中可远程利用的安全漏洞的头号原因。没有大小修饰符
- 一些
scanf
格式字符串是一样gets
不安全,尤其是%s
:第二关,从来没有使用任何的
*scanf
功能要么,因为。 -
scanf
中的数字溢出引发了未定义的行为,这意味着程序可能会因为某人键入的数字太大而崩溃。 - 使用
scanf
编写稳健的输入解析器非常困难,因为如果失败,它不会精确地告诉您问题字符在哪里。
对于这样一个简单的任务,你应该使用fgets
(或更好,getline
如果有的话)的年龄转换为整数,strtoul
。 (年龄不能为负,所以你想要的签名版本不要使用atoi
和朋友 - 。就像*scanf
,他们不给你关于无效输入足够的信息)
注**不使用'gets' ** *非常重要*。并且'gets'已被弃用,并且在最近的C或Posix标准中被删除(或已弃用) – 2012-02-03 19:26:14
如何在上述情况下通过fgets获得输入? – 2012-02-03 19:35:52
@MUHAMMADFaysal查阅手册。如果我只是告诉你,它不会教你任何东西。 – cnicutar 2012-02-03 19:38:27