首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gets()的问题

gets()的问题
EN

Stack Overflow用户
提问于 2011-08-31 23:16:55
回答 1查看 2.7K关注 0票数 0

我试图获取输入数据并使用结构打印它。当我运行这段代码时,它不接受姓氏的输入。它直接要求输入名字。有人能帮我做这个吗。谢谢。

代码语言:javascript
复制
address.c

typedef struct 
{
  char lname[25];
  char fname[20];
  char address[20];
  char phonenumber[20];
}addressbook;

addressbook a;
int main()
{
 printf("enter details:\n");
   printf("enter lastname:\n");
   gets(a.lastname);
   printf("enter firstname:\n");
   gets(a.firstname);
   printf("enter address:\n");
   gets(a.address);
   printf("enter phone number:\n");
   gets(a.phonenumber);
   printf("lastname:%s\n",a.lastname);
   printf("firstname: %s\n", a.firstname);
   printf("address:%s\n", a.address);
   printf("phone number:%s\n", a.phonenumber);
}

当我运行这个程序时,它不会等待输入姓氏。直接输入名字。

EN

回答 1

Stack Overflow用户

发布于 2011-10-04 08:35:00

该代码甚至不会按原样编译,生成(在我的环境中):

代码语言:javascript
复制
pax@pax-desktop:~$ gcc -Wall -Wextra -o qq qq.c
qq.c: In function ‘main’:
qq.c:12:2: warning: implicit declaration of function ‘printf’
qq.c:12:2: warning: incompatible implicit declaration of built-in function ‘printf’
qq.c:14:4: warning: implicit declaration of function ‘gets’
qq.c:14:10: error: ‘addressbook’ has no member named ‘lastname’
qq.c:16:10: error: ‘addressbook’ has no member named ‘firstname’
qq.c:21:28: error: ‘addressbook’ has no member named ‘lastname’
qq.c:22:31: error: ‘addressbook’ has no member named ‘firstname’
qq.c:25:1: warning: control reaches end of non-void function

您应该始终(至少在最初)使用高警告级别进行编译,并注意编译器告诉您的内容:

gets.

  • you应该在结构中使用一致的字段名(

  • ),您应该从非空函数返回一些东西(从技术上讲,这在以后的标准版本中是不必要的,但对于portability).

来说仍然是个好主意。

此外,您可能需要考虑以下几点:

  • int main()不是main函数的两种规范形式之一。虽然标准允许实现定义的额外功能,但对于这种特殊情况,“正确”的一个是int main (void).
  • gets是一个危险的函数,因为无法防止缓冲区溢出,从而使代码不安全。例如,如果我为自己的名字输入了1000个字符,它很可能会通过覆盖堆栈上的大量会计信息(例如,返回地址)来破坏您的程序。您可以找到一个更安全的输入函数here.

进行大部分这些更改后,您最终会得到如下内容:

代码语言:javascript
复制
#include <stdio.h>

typedef struct {
    char lastname[25];
    char firstname[20];
    char address[20];
    char phonenumber[20];
}addressbook;

addressbook a;
int main (void) {
    printf("enter details:\n");

    printf("enter lastname:\n");
    gets(a.lastname);

    printf("enter firstname:\n");
    gets(a.firstname);

    printf("enter address:\n");
    gets(a.address);

    printf("enter phone number:\n");
    gets(a.phonenumber);

    printf("lastname:%s\n",a.lastname);
    printf("firstname: %s\n", a.firstname);
    printf("address:%s\n", a.address);
    printf("phone number:%s\n", a.phonenumber);

    return 0;
}

它编译并运行正常,尽管它仍然存在严重的缓冲区溢出漏洞。如果你想修复这个问题,你可以参考我给出的链接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7264562

复制
相关文章

相似问题

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