проблема с gets () - PullRequest
       7

проблема с gets ()

0 голосов
/ 01 сентября 2011

Я пытаюсь взять входные данные и распечатать их, используя структуры.когда я запускаю этот код, он не принимает данные для фамилии.Он прямо просит ввести ввод для имени.Может кто-то помочь мне с этим.Спасибо.

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);
}

Когда я запускаю это, он не ждет ввода фамилии.он напрямую идет на ввод имени.

1 Ответ

0 голосов
/ 04 октября 2011

Этот код не будет даже компилироваться в том виде, в каком он есть, и вырабатывать (в моей среде):

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;
}

, который компилируется и работает нормально, хотя все еще имеет серьезную уязвимость переполнения буфера.Если вы хотите это исправить, вы можете воспользоваться ссылкой, которую я дал.

...