该代码甚至不会按原样编译,产生(在我的环境中):
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
您应该始终(至少在最初)以高警告级别进行编译,并注意编译器告诉您的内容:
stdio.h
如果要使用printf
and ,则应包括在内gets
。
- 您应该在结构中使用一致的字段名称。
- 您应该从非 void 函数返回一些东西(从技术上讲,这在标准的更高版本中不是必需的,但它仍然是可移植性的好主意)。
此外,您可能需要考虑以下事项:
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;
}
它编译和运行正常,尽管它仍然存在严重的缓冲区溢出漏洞。如果你想解决这个问题,你可以参考我给出的链接。