c语言中的嵌套结构
我必须构建一个嵌套结构来存储关于某人的一些基本信息(姓名、年龄、地址)。所以我创建了一个名为“info”的结构,为了保存地址,我在“info”中创建了另一个嵌套结构,名为“address”。但每当我提示使用for循环存储值时,就会出现错误。这里的问题是什么?我该如何解决 [错误]“结构信息”没有名为“地址”的成员c语言中的嵌套结构,c,struct,structure,declaration,C,Struct,Structure,Declaration,我必须构建一个嵌套结构来存储关于某人的一些基本信息(姓名、年龄、地址)。所以我创建了一个名为“info”的结构,为了保存地址,我在“info”中创建了另一个嵌套结构,名为“address”。但每当我提示使用for循环存储值时,就会出现错误。这里的问题是什么?我该如何解决 [错误]“结构信息”没有名为“地址”的成员 [警告]声明不声明任何内容[默认情况下已启用] #包括 int main(){ 结构信息{ 字符名[30]; 智力年龄; 结构地址{ char area_name[39]; 内特豪斯尤
[警告]声明不声明任何内容[默认情况下已启用]
#包括
int main(){
结构信息{
字符名[30];
智力年龄;
结构地址{
char area_name[39];
内特豪斯尤诺;
查尔区[39];
};
};
结构信息人[10];
int i;
对于(i=0;i您在结构Info
中声明了类型struct address
,但不是此类型的数据成员
你可以写一个例子
struct Info{
char name[30];
int age;
struct address{
char area_name[39];
int house_no;
char district[39];
} address;
^^^^^^^^
};
结构Info
具有名为address
的嵌套结构,但没有名为address
的成员变量
你应该这样做
struct Info
{
...
struct
{
...
} address;
};
目前您所拥有的只是一个名为address
的结构声明,但是在struct Info
中需要一个名为address
的变量来使用Person[i].address
语法
您需要将单词地址
移动一点:
struct Info{
char name[30];
int age;
struct {
char area_name[39];
int house_no;
char district[39];
} address; // <<< here it is now
};
结构信息{
字符名[30];
智力年龄;
结构{
char area_name[39];
内特豪斯尤诺;
查尔区[39];
}address;//从它看来,您应该“配音”您的地址结构,即
struct address{
char area_name[39];
int house_no;
char district[39];
} adr_;
然后设置门牌号:
&Person[i].adr_.house_no
下面是使用.I启用C11编译此文件的更新代码
#include <stdio.h>
int main(){
struct Info{
char name[30];
int age;
struct {
char area_name[39];
int house_no;
char district[39];
};
};
struct Info Person[10];
int i;
for(i=0;i<10;i++){
printf("enter info of person no %d\n",i);
printf("enter name\n");
scanf(" %s",Person[i].name);
printf("enter age\n");
scanf("%d",&Person[i].age);
printf("enter address :\n");
printf("enter area name :\n");
scanf(" %s",Person[i].area_name);
printf("enter house no : \n");
scanf("%d",&Person[i].house_no);
printf("enter district : \n");
scanf(" %s",Person[i].district);
}
}
#包括
int main(){
结构信息{
字符名[30];
智力年龄;
结构{
char area_name[39];
内特豪斯尤诺;
查尔区[39];
};
};
结构信息人[10];
int i;
对于(i=0;它的外部结构中有一个struct地址。但这只是一个匿名结构成员,没有名字。这是自C99以来的合法语法。@Olaf:标准说明(ISO/IEC 9899:2011§6.7.2.1 13)类型说明符为不带标记的结构说明符的未命名成员称为匿名结构;类型说明符为不带标记的联合说明符的未命名成员称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员。这适用于递归如果包含的结构或联合也是匿名的,则为ly。在问题的原始声明中,结构地址
有一个标记,因此它不是匿名结构成员。@JonathanLeffler:嗯,你是对的。我将它与gcc-fplan9扩展
结合使用(希望它能成为标准)有趣的是,它包括一个Microsoft扩展,允许这种构造(以及使用typedef
或外部结构定义)。很抱歉,我总是忘记由于这些限制,标准兼容版本实际上是多么无用。@Olaf:有趣的是,它可以在任何地方使用。它改变了有效结构的含义(但不清楚)C89程序,如果标记的结构声明被视为匿名成员。这可能就是它不在标准中的原因。@JonathanLeffler:你能详细说明一下吗?我很久没有使用C89了。OTOH,OOP不使用它太有用了(不过你必须显式地启用它)-当然,如果您有很好的文档记录。请参阅。为什么名称会更改?结构标记与结构元素位于单独的命名空间中,因此`struct address{…}address;是完全有效的C.@JonathanLeffler,我当时对此不太确定。不过,阅读以下内容时,这有助于避免混淆:struct address address;
注意,在调用scanf()时,不应在字符串成员前面加上&
。如果确实包含&
,则传递的类型是char(*)[30]
,而不是char*
,但是%s
格式需要一个char*
。如果编译器设置得足够复杂(-Wall
应该足够),它会告诉您类型不匹配的情况,您应该注意。(是的,在大多数实际机器上的实际操作中,它确实工作正常-但这有点巧合;存在类型不匹配,您应该避免这些。)
&Person[i].adr_.house_no
#include <stdio.h>
int main(){
struct Info{
char name[30];
int age;
struct {
char area_name[39];
int house_no;
char district[39];
};
};
struct Info Person[10];
int i;
for(i=0;i<10;i++){
printf("enter info of person no %d\n",i);
printf("enter name\n");
scanf(" %s",Person[i].name);
printf("enter age\n");
scanf("%d",&Person[i].age);
printf("enter address :\n");
printf("enter area name :\n");
scanf(" %s",Person[i].area_name);
printf("enter house no : \n");
scanf("%d",&Person[i].house_no);
printf("enter district : \n");
scanf(" %s",Person[i].district);
}
}