c语言中的嵌套结构

c语言中的嵌套结构,c,struct,structure,declaration,C,Struct,Structure,Declaration,我必须构建一个嵌套结构来存储关于某人的一些基本信息(姓名、年龄、地址)。所以我创建了一个名为“info”的结构,为了保存地址,我在“info”中创建了另一个嵌套结构,名为“address”。但每当我提示使用for循环存储值时,就会出现错误。这里的问题是什么?我该如何解决 [错误]“结构信息”没有名为“地址”的成员 [警告]声明不声明任何内容[默认情况下已启用] #包括 int main(){ 结构信息{ 字符名[30]; 智力年龄; 结构地址{ char area_name[39]; 内特豪斯尤

我必须构建一个嵌套结构来存储关于某人的一些基本信息(姓名、年龄、地址)。所以我创建了一个名为“info”的结构,为了保存地址,我在“info”中创建了另一个嵌套结构,名为“address”。但每当我提示使用for循环存储值时,就会出现错误。这里的问题是什么?我该如何解决

[错误]“结构信息”没有名为“地址”的成员
[警告]声明不声明任何内容[默认情况下已启用]

#包括
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);
    }
}