Как распечатать элементы Stuct с помощью указателей массива? - PullRequest
0 голосов
/ 20 января 2020

Код, который я написал до сих пор, следующий без библиотек. В основном я использовал stdio.h и stdlib.h.

typedef struct ID{
     char firstName[21];
     char lastName[21];
     char phoneNumber[11];
}ID;

ID PrintList(ID *ptr,int i){
     int l=1;
     printf(" #   First Name       Last Name       Phone Number\n");
     while(l<i+1)
     {
        printf(" %d.   %s",l,&ptr[l]);
        l++;
    }
} 

ID addNew(ID *ptr,int i){
    char fname[21],lname[21],phone[11];
    if(i<3)
     {  
        ID user;
        ptr[i] = user;
        printf("enter the first name:   ");
        scanf("%s",&fname);
        *ptr->firstName= fname;
        printf("enter the last name:    ");
        scanf("%s",&lname);
        *ptr->lastName = lname;
        printf("enter the phone number: "); 
        scanf("%s",&phone);
        *ptr->phoneNumber = phone;
    }
    else
    {
        printf("sorry but you have reach max capacity\n");  
    }
} 

int main(int argc, char *argv[]) {
    int answere,i=0;
    printf("******* WELCOME TO PHONEBOOK **********\n\n\n");
    printf("***************************************\n");
    printf("*                MENU                 *\n");
    printf("*                                     *\n");
    printf("* 1.Add New   2.Print list     3.Exit *\n\n");
    printf("***************************************\n\n");

    ID* ptr=(int*)malloc(21*sizeof(ID));
    do
    {
        printf("Please select (1, 2 or 3): ");
        scanf("%d",&answere);
        if(answere!=1 && answere!=2 && answere!=3)
        {
            printf("...Error... \ngive me a correct answere\n");
        }
        if(answere == 1)
        {
            i++;
            addNew(ptr,i);
        }
        else if(answere==2)
        {
            PrintList(ptr,i);
        }
    }while(answere!=3); 

    return 0;
}

Итак, как я уже сказал, моя проблема в том, что я не могу печатать элементы структуры, поскольку мне нужно печатать их с использованием массива из указателей, хотя. Я думаю, что я просто не написал что-то правильное, как будто это просто небольшая ошибка логики c в printf. Единственное препятствие, которое у меня есть, состоит в том, что массив указателей необходимо сделать в main.

1 Ответ

0 голосов
/ 20 января 2020

Вы кажетесь полностью потерянным ...

Некоторые основы

Вы передаете указатель / ссылку на первый элемент массива (адрес первого элемента), чтобы получить значение по этому адресу ( разыменовать его) вы можете сделать две вещи:

  • * ptr // но я не рекомендую использовать его со структурами
  • ptr [0]

поскольку вы используете структуры, как правило, большие, вы должны работать с указателями, и по этой причине существует так называемый "стрелка" оператор, который можно использовать для доступа к членам указателя структуры

  • ptr-> firstName

Ваша функция будет выглядеть следующим образом:

    void PrintList(ID *ptr, int l)
    {
         int i;
         printf(" #   First Name       Last Name       Phone Number\n");
         for(i = 0; i < l; i++)
         {
            printf("%2d.   %s       %s       %s\n", 
i, ptr[i].firstName, ptr[i].firstName, ptr[i].phoneNumber);
        }
    }

Также я рекомендую использовать '\ t' вместо пробелов для выравнивания столбцов.

...