[英]problem with gets()
我正在尝试获取输入数据并使用结构进行打印。 当我运行此代码时,它不会接受姓氏的输入。 它直接要求输入名字的输入。 有人可以帮我弄这个吗。 谢谢。
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);
}
当我运行此程序时,它不等待输入姓氏。 它直接去输入名字。
该代码甚至不会按现状编译 ,在我的环境中生成:
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
您应该始终(至少在开始时)以较高的警告级别进行编译,并注意编译器告诉您的内容:
printf
和gets
则应包含stdio.h
。 此外,您可能需要考虑以下因素:
int main()
不是main
函数的两种规范形式之一。 尽管该标准允许实现定义的额外值,但此特定情况的“正确”值将是int main (void)
。 gets
是一个危险的函数,因为没有办法防止缓冲区溢出,从而使您的代码不安全。 例如,如果我输入名字的第一个字符为一千个字符,则可能会通过覆盖堆栈上的大量会计信息(例如返回地址)来破坏您的程序。 您可以在此处找到更安全的输入功能。 进行大部分更改后,您将得到类似以下内容的结果:
#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;
}
尽管仍然存在严重的缓冲区溢出漏洞,但它可以编译并运行正常。 如果要解决此问题,可以参考我给的链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.