如何使用指针数组打印结构实体?

时间:2019-01-01 10:14:08

标签: c

我用C语言编写了一个程序,该程序的结构名为ak。 有一个指针数组s,它存储ak类型的数组p的地址。输入值后,仅打印str

如何使用指针数组同时打印strid

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

设置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);
                          ^ 

屏幕截图在这里:

Appending rows to table

当我尝试set2代码时,它仅显示str值。 屏幕截图在这里:

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

1 个答案:

答案 0 :(得分:2)

关于set1和printf("%s\n",*s[i].id);的问题。

*s[i].id等效于*(s[i].id),而不是您想像的(*s[i]).id。由于s[i]的类型为ak *,因此无法通过s[i].id获得其字段 id

您可以编写(*s[i]).id,但更易读的方法是使用s[i]->id

您的 printf 还有另一个问题,格式不能为"%s",因为s[i]->id int 而不是 char *


关于set2

您做printf("%s\n",s[i]);,您会感到惊讶,因为仅打印了字符串,您如何期望打印字符串 int?

您请求打印字符串(格式%s),但是s[i]不是字符串。通过机会 struct 以字段 str 作为字符串开始,因此可以编写它,但这不是正确的方法。

您必须显式打印每个属性,例如执行printf("%s %d\n",s[i]->str, s[i]->id);