Этот код не будет даже компилироваться в том виде, в каком он есть, и вырабатывать (в моей среде):
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
и gets
. - , которые вы должны использоватьнепротиворечивые имена полей в вашей структуре.
- вы должны возвращать что-то из не пустых функций (технически это не нужно в более поздних версиях стандарта, но это все еще хорошая идея для переносимости).
Кроме того, вы можете рассмотреть следующее:
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;
}
, который компилируется и работает нормально, хотя все еще имеет серьезную уязвимость переполнения буфера.Если вы хотите это исправить, вы можете воспользоваться ссылкой, которую я дал.