【问题标题】:Input by using gets function使用gets函数输入
【发布时间】:2012-02-03 19:16:44
【问题描述】:

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

【问题讨论】:

    标签: c


    【解决方案1】:

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

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

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

    附注:

    【讨论】:

    • 注释不要使用gets非常重要的。而gets 在最近的 C 或 Posix 标准中已被弃用,并被删除(或弃用)
    • 在上述情况下如何通过 fgets 获取输入?
    • @MUHAMMADFaysal 查看手册。如果我只是告诉你,它不会教给你任何东西。
    【解决方案2】:

    首先,永远不要使用gets。没有办法告诉它你的缓冲区有多大,所以它会高兴地把输入写到最后,让程序崩溃。这曾经是网络服务器中可远程利用的安全漏洞的第一大原因。

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

    1. 一些scanf 格式字符串与gets 一样不安全,尤其是没有大小修饰符的%s
    2. scanf 内的数字溢出会引发未定义的行为,这意味着您的程序可能会因为有人输入的数字太大而崩溃。
    3. 使用scanf 编写一个强大的输入解析器是极其困难的,因为如果它失败了,它并不能准确地告诉你问题字符在哪里。

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

    对于更复杂的任务,您应该联系lexyacc

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        相关资源
        最近更新 更多