2016-03-08 168 views
4

我必須建立一個嵌套結構來存儲一些關於某人(姓名,年齡,地址)的基本信息。所以我創建了一個叫做「info」的結構,並且在「info」中創建另一個叫做「address」的嵌套結構。但每當我提示使用for循環存儲值時,我都會收到錯誤。這裏有什麼問題,我該如何解決它?c中的嵌套結構

[錯誤] '結構信息' 沒有名爲 '地址' 成員
[默認啓用] [注意]聲明沒有宣佈任何

#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); 
    } 
} 
+0

請注意,您不應在調用scanf()時用'&'作爲字符串成員的前綴。如果包含'&',則傳遞的類型是'char(*)[30]'而不是'char *',但'%s'格式需要'char *'。如果編譯器設置得很模糊('-Wall'應該足夠了),它會告訴你類型不匹配 - 並且你應該注意它。 (是的,在大多數實際機器的實際操作中,它確實工作正常 - 但有點巧合;存在類型不匹配,你應該避免這些。) –

回答

7

您在聲明的類型struct address結構Info但不是此類型的數據成員。

你可以寫例如

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

Info有一個嵌套的結構命名address,但不能命名爲address一個成員變量的結構。

你應該做

struct Info 
{ 
    ... 
    struct 
    { 
     ... 
    } address; 
}; 
+1

外部'struct'中有一個'struct address'。但那只是一個沒有名字的匿名結構成員。這是自C99以來的合法語法。 – Olaf

+1

@Olaf:標準說明(ISO/IEC 9899:2011§6.7.2.1¶13)_一個未命名的成員,其類型說明符是一個沒有標籤的結構說明符,稱爲匿名結構;一個未命名的成員,其類型說明符是與 沒有標籤的聯合說明符稱爲匿名聯合。匿名結構或工會成員 被視爲包含結構或工會的成員。如果包含的結構或聯合也是匿名的,則這適用於 遞歸。在問題的原始聲明中,'struct address'具有一個標記,因此它不是匿名結構成員。 –

+0

@JonathanLeffler:嗯,你是對的。我將它與gcc -fplan9-extensions一起使用(希望它會使其成爲標準),其中有趣地包括允許這種構造的Microsoft擴展(以及使用'typedef'或外部結構定義)。對不起,我總是忘記了這些限制實際上是否符合標準的版本。 – Olaf

4

你在看什麼只是一個叫address結構的聲明,但你需要一個struct Infoaddress使用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 
}; 
+0

爲什麼名稱改變?結構標籤位於與結構元素不同的名稱空間中,所以'struct address {...}地址;是完全有效的C. –

+0

@JonathanLeffler,那時我還不太確定。儘管如此,在閱讀以下內容時,它可以幫助避免混淆:'struct address address;' – ForceBru