【问题标题】:Nested structure in cc中的嵌套结构
【发布时间】:2016-03-08 14:22:33
【问题描述】:

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

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

#include <stdio.h>

int main(){

    struct Info{
        char name[30];
        int age;
        struct address{
            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].address.area_name);
        printf("enter house no : \n");
        scanf("%d",&Person[i].address.house_no);
        printf("enter district : \n");
        scanf("%s",&Person[i].address.district);
    }
}

【问题讨论】:

  • 请注意,在对scanf() 的调用中,不应在字符串成员前面加上&amp;。如果确实包含&amp;,则传递的类型是char (*)[30] 而不是char *,但%s 格式需要char *。如果编译器设置得足够挑剔(-Wall 应该足够了),它会告诉你类型不匹配——你应该注意它。 (是的,在大多数实际机器上的实际实践中,它确实可以正常工作——但这​​有点巧合;存在类型不匹配,你应该避免这些。)

标签: c struct structure declaration


【解决方案1】:

您在结构 Info 中声明了一个类型 struct address,但不是该类型的数据成员。

你可以写例子

struct Info{
    char name[30];
    int age;
    struct address{
        char area_name[39];
        int house_no;
        char district[39];
    } address;
      ^^^^^^^^
};

【讨论】:

    【解决方案2】:

    您目前拥有的只是一个名为address 的结构的声明,但您需要在struct Info 中名为address变量使用Person[i].address 语法。

    你需要将address这个词移动一点:

    struct Info{
        char name[30];
        int age;
        struct {
            char area_name[39];
            int house_no;
            char district[39];
        } address; // <<< here it is now
    };
    

    另一种选择是使用以下内容:

    struct Info{
        char name[30];
        int age;
        struct addr{ // as noted by @JonathanLeffler,
                     // it's not necessary to change the 
                     // name of a struct
            char area_name[39];
            int house_no;
            char district[39];
        };
        struct addr address; // <<< a variable of type struct addr
    };
    

    【讨论】:

    • 为什么改名?结构标签与结构元素位于单独的命名空间中,因此 `struct address { ... } address;是完全有效的 C。
    • @JonathanLeffler,那时我不太确定。尽管如此,在阅读以下内容时避免混淆还是有帮助的:struct address address;
    【解决方案3】:

    结构Info 有一个名为address 的嵌套结构,但没有一个名为address 的成员变量。

    你应该这样做

    struct Info
    {
        ...
        struct
        {
            ...
        } address;
    };
    

    【讨论】:

    • 在外部struct 中有一个struct address。但这只是一个没有名字的匿名结构成员。这是自 C99 以来的合法语法。
    • @Olaf:标准说(ISO/IEC 9899:2011 §6.7.2.1 ¶13)类型说明符是没有标签的结构说明符的未命名成员称为匿名结构;类型说明符是没有标记的联合说明符的未命名成员称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员。如果包含结构或联合也是匿名的,则递归适用。在问题的原始声明中,struct address 有一个标签,因此它不是匿名结构成员。
    • @JonathanLeffler:嗯,你是对的。我将它与 gcc -fplan9-extensions 结合使用(希望它能够成为标准),有趣的是,它包含一个允许此类构造的 Microsoft 扩展(以及使用 typedef 或外部结构定义)。抱歉,由于这些限制,我总是忘记符合标准的版本实际上是多么无用。
    • @Olaf:有趣的是它可以在任何地方使用。如果标记结构声明被视为匿名成员,它会更改有效(但晦涩)的 C89 程序的含义。这可能是它不在标准中的原因。
    • @JonathanLeffler:你能详细说明一下吗?好久没用过C89了。 OTOH,对于 OOP 来说,不使用它太有用了(不过,你必须明确启用它)——当然,如果你有很好的文档记录。见here
    【解决方案4】:

    http://www.c4learn.com/c-programming/c-nested-structure/看来,您应该“复制”您的地址结构,即

    struct address{
        char area_name[39];
        int house_no;
        char district[39];
    } adr_;
    

    然后设置门牌号:

    &Person[i].adr_.house_no
    

    【讨论】:

      【解决方案5】:

      这是使用anonymous structure 的更新代码。我启用了 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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-12
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多