Как использовать массив указателей для печати структурных объектов? - PullRequest
0 голосов
/ 01 января 2019

Я написал программу на C, которая имеет структуру с именем ak.Существует массив указателей s, в котором хранится адрес массива p типа ak.После ввода значений печатается только str.

Как можно распечатать как str, так и id, используя массив указателей?

set 1:

#include<stdio.h>
typedef struct
{
    char str[10];
    int id;
}ak;

int main()
{   
    printf("Hey\n"); 
    int i;
    ak *s[5],p[5];
    for(i=0;i<5;i++)
    {
        s[i]=&p[i];
        printf("Input string:");
        scanf("%s",&p[i].str);
        printf("Input id:");
        scanf("%d",&p[i].id);
    }    
    i=0;
    while(i<5)
    {
        printf("%s\n",s[i].id);
        ++i;
    } 
    return 0;   
}

set 2:

#include<stdio.h>
typedef struct
{
    char str[10];
    int id;
}ak;

int main()
{  
    printf("Hey\n"); 
    int i;
    ak *s[5],p[5];
    for(i=0;i<5;i++)
    {
         s[i]=&p[i];
         printf("Input string:");
         scanf("%s",&p[i].str);
         printf("Input id:");
         scanf("%d",&p[i].id);
    }    
    i=0;
    while(i<5)
    {
         printf("%s\n",s[i]);
         ++i;
    }
    return 0;    
}

Поэтому, когда я попробовал код set1, он дал мне сообщение об ошибке:

C:\CPP\c\Prototypes>gcc -o ct structure.c
structure.c: In function 'main':
structure.c:22:32: error: request for member 'id' in something not a structure or union

       printf("%s\n",*s[i].id);
                          ^ 

Снимок экрана здесь:

https://imageshack.com/a/img921/3084/j1rHig.png

Когда я пробовал код set2, он печатал только значения str.скриншот здесь:

https://imageshack.com/a/img922/614/JHSGZ9.png

1 Ответ

0 голосов
/ 01 января 2019

Относительно set1 и ваших проблем с printf("%s\n",*s[i].id);.

*s[i].id эквивалентно *(s[i].id), а не (*s[i]).id, как вы, вероятно, предполагали.Поскольку тип s[i] равен ak *, вы не можете получить его поле id через s[i].id.

Вы можете написать (*s[i]).id, но более читаемый способ - использовать s[i]->id.

У вашего printf есть другая проблема, формат не может быть "%s", потому что s[i]->id - это int , а не char *


Относительно set2

Вы делаете printf("%s\n",s[i]);, и вы удивлены, потому что печатается только строка, как вы можете ожидать, что выведите строку и Инт?

Вы запрашиваете печать строки (формат %s), но s[i] не является строкой.По случайному struct начинается с поля str , являющегося строкой, так что да, вы пишете это, но это не правильный путь.

Вы должны явно печатать каждый атрибут, например, делая printf("%s %d\n",s[i]->str, s[i]->id);

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