使用获取功能输入

问题描述:

在下面的代码当我想输入第二个学生或> 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:

+0

注**不使用'gets' ** *非常重要*。并且'gets'已被弃用,并且在最近的C或Posix标准中被删除(或已弃用) – 2012-02-03 19:26:14

+0

如何在上述情况下通过fgets获得输入? – 2012-02-03 19:35:52

+1

@MUHAMMADFaysal查阅手册。如果我只是告诉你,它不会教你任何东西。 – cnicutar 2012-02-03 19:38:27

这是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。无法告诉它缓冲区有多大,因此它会愉快地写入输入,并使程序爆炸。这曾经是网络服务器中可远程利用的安全漏洞的头号原因。没有大小修饰符

  1. 一些scanf格式字符串是一样gets不安全,尤其是%s

    第二关,从来没有使用任何的*scanf功能要么,因为。

  2. scanf中的数字溢出引发了未定义的行为,这意味着程序可能会因为某人键入的数字太大而崩溃。
  3. 使用scanf编写稳健的输入解析器非常困难,因为如果失败,它不会精确地告诉您问题字符在哪里。

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

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