Проблема с использованием структуры в цикле for - PullRequest
0 голосов
/ 31 августа 2011

Это домашнее задание. Мой компилятор - CodeBlocks.

Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Address{
    char number[5];
    char street[30];
    char city[30];
};

struct Employee{
    char ID[7];
    char name[31];
    struct Address *addr;
};

int main(){
    int n,i;
    char temp[7];
    printf("Enter number of Employee : ");
    scanf("%d",&n);
    struct Employee **p=(struct Employee **)malloc(n*sizeof(struct Employee *));

    for (i=0; i<n; i++)
    {
        p[i]=(struct Employee *)malloc(sizeof(struct Employee));
        p[i]->addr=(struct Address *)malloc(sizeof(struct Address));
    }

    for(i=0; i<n; i++)
    {
        printf("Employee #%d\n",i+1);
        printf("Enter ID : ");
        gets(p[i]->ID);
        printf("Enter Name : ");
        gets(p[i]->name);
        printf("Enter Home number : ");
        gets(p[i]->addr->number);
        printf("Enter Street : ");
        gets(p[i]->addr->street);
        printf("Enter City : ");
        gets(p[i]->addr->city);
    }
}

Моя проблема в том, что когда я запускаю этот код, я не могу ввести идентификатор сотрудника № 1; тем не менее, я могу ввести идентификатор сотрудника № 2 и № 3.

Где моя проблема?

Ответы [ 3 ]

1 голос
/ 31 августа 2011

Кажется, есть некоторая проблема с get (), читающим что-то из консоли перед первым проходом цикла.

Добавление gets(temp); прямо перед тем, как цикл, кажется, исправит это.Лучшим решением было бы использовать что-то отличное от gets ().

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

Вы должны когда-либо явно очистить буфер ввода после любого пользовательского ввода.И вы должны сделать ваши входные данные безопасными с ограничителем размера.И вы должны использовать возвращаемое значение из scanf.

scanf("%d",&n);while(getchar()!='\n');
...
scanf("%6[^\n]",p[i]->ID);while(getchar()!='\n');
...
scanf("%30[^\n]",p[i]->name);while(getchar()!='\n');
...
scanf("%4[^\n]",p[i]->addr->number);while(getchar()!='\n');
...
scanf("%29[^\n]",p[i]->addr->street);while(getchar()!='\n');
...
scanf("%29[^\n]",p[i]->addr->city);while(getchar()!='\n');
0 голосов
/ 31 августа 2011

Начальный scanf("%d", &n); не использует завершающий символ новой строки, поэтому он остается доступным для вызова gets().

Кстати, никогда использовать gets(). Это не может быть безопасно использовано. Например, если вы читаете в 6-байтовый массив, а пользователь вводит 10 символов, у вас переполнение буфера. Попробуйте вместо этого использовать fgets() (но учтите, что в отличие от gets() он оставляет символ '\n' в буфере).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...