首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用gets函数输入

使用gets函数输入
EN

Stack Overflow用户
提问于 2012-02-04 03:16:45
回答 3查看 2.9K关注 0票数 1

在下面的代码中,当我想输入第二个学生或>2个学生的记录时..编译器跳过名称输入,并接受类和年龄的输入。有什么问题,请帮帮我?

代码语言:javascript
复制
#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();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-04 03:18:09

这个问题很常见。试试这个:

代码语言:javascript
复制
scanf("%d ", &a[i].age);
         ^ <--- This space will make scanf eat the remaining blanks

关于这一点,有几个常见问题:

  • Scanf interlace
  • Scanf problems
  • Flushing stdin

次要注释:

  • .请改用fgets
票数 3
EN

Stack Overflow用户

发布于 2012-02-04 03:33:46

首先,永远不要使用gets。没有办法告诉它你的缓冲区有多大,所以它会兴高采烈地在结束后写入输入,并使程序崩溃。这曾经是网络服务器中可被远程利用的安全漏洞的头号原因。

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

  1. 某些scanf格式的字符串与gets一样不安全,特别是在scanf内没有大小溢出的%s会引发未定义的行为,这意味着您的程序可能会因为某人键入的数字太大而崩溃。
  2. 使用scanf编写健壮的输入解析器非常困难,因为如果失败,它不会告诉您问题字符的确切位置。

对于像这样的简单任务,您应该使用fgets (或者,如果有的话,最好使用getline ),并使用strtoul将年龄转换为整数。(年龄不能为负数,因此您需要无符号版本。不要使用atoi和朋友-就像*scanf一样,他们不会给你提供关于无效输入的足够信息。)

对于更复杂的任务,你应该使用lexyacc

票数 3
EN

Stack Overflow用户

发布于 2012-02-04 03:23:12

scanf。在此之后按ENTER时,换行符将完成对gets的下一次调用。

要解决这个问题,可以在循环末尾的scanf之后添加一个getchar,它将使用换行符。

代码语言:javascript
复制
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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9134208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档