我用C语言编写了一个程序,该程序的结构名为ak
。
有一个指针数组s
,它存储ak类型的数组p
的地址。输入值后,仅打印str
。
如何使用指针数组同时打印str
和id
?
设置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);
^
屏幕截图在这里:
当我尝试set2代码时,它仅显示str值。 屏幕截图在这里:
答案 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);