使用gets函数输入

时间:2012-02-03 19:16:45

标签: c

在下面的代码中当我想要输入第二个学生或> 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();
}

3 个答案:

答案 0 :(得分:3)

问题很常见。试试这个:

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

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

次要说明:

答案 1 :(得分:3)

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

其次,从不使用任何*scanf函数,因为:

  1. 某些scanf格式字符串与gets一样不安全,特别是%s没有尺寸修饰符。
  2. scanf内的数字溢出会引发未定义的行为,这意味着您的程序可能会因为某人输入的数字过大而崩溃。
  3. 使用scanf编写健壮的输入解析器非常困难,因为如果失败,则不能准确地告诉您问题字符的位置。
  4. 对于像这样的简单任务,您应该使用fgets(或者更好的是getline,如果有的话)并将年龄转换为strtoul的整数。 (年龄不能为负数,因此您需要未签名的版本。请勿使用atoi和朋友 - 就像*scanf一样,他们不会向您提供有关无效输入的足够信息。)

    对于更复杂的任务,您应该触及lexyacc

答案 2 :(得分:1)

这是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();
}