C 中的结构有 "no member named..." 错误

Structures in C with "no member named..." error

我正在尝试创建一个包含国家、州、城市和当地商店名称的结构。不幸的是,我得到这个错误:

No member named bavaria in struct country

所以错误似乎出现在这里: strcpy(germany.bavaria.ingolstadt.westpark, "Westpark");

我做错了什么?

这是我的完整代码:

#include <stdio.h>
#include <string.h>

int main() {

    struct country {
        char countryname[100];
        struct state {
            char statename[100];
            struct city {
                char cityname[100];
                int postal;
                struct shop {
                    char shopname[100];
                } shop;
            } city;
        } state;
    } country;

    struct country germany;
    struct state bavaria;
    struct city ingolstadt;
    struct shop westpark;

    strcpy(germany.countryname, "Germany");
    strcpy(germany.bavaria.ingolstadt.westpark, "Westpark");

    return 0;
}

您已经定义了四个独立的结构体。他们没有相互联系。

您现在可以做到

strcpy(germany.state.city.shop, "Westpark");

strcpy(westpark, "Westpark");

通常,结构成员名称是编译时的东西。它们被编译器解析为地址偏移量。您 city/state/shop 名称是运行时数据。您不能将它们用作结构成员。

您显然还想建立一个 1:n 关系模型。我认为您需要不同的数据结构,例如哈希。

让我们将定义与使用它们的地方分开,以便于阅读:

struct shop {
    char shopname[100];
};

struct city {
    char cityname[100];
    int postal;
    struct shop shop;
};

struct state {
    char statename[100];
    struct city city; 
};

struct country {
    char countryname[100];
    struct state state;
};

现在你有:

struct country germany;
struct state bavaria;
struct city ingolstadt;
struct shop westpark;
strcpy(germany.bavaria.ingolstadt.westpark, "Westpark");

问题是:struct country 没有名为 bavaria 的成员。它只有一个名为 state 的成员。你要的是:

strcpy(germany.state.city.shop.shopname, "Westpark");

您可能真正想要的是:

struct country germany;
strcpy(germany.countryname, "Germany");
strcpy(germany.state.statename, "Bavaria");
strcpy(germany.state.city.cityname, "Ingolstadt");
strcpy(germany.state.city.shop.shopname, "Westpark");

变量 bavariaingolstadtwestpark 是单独的项目,不是 country 结构的成员。

strcpy(germany.state.city.shop.shopname, "Westpark");

可能有效(但可能无法达到您的预期)。

根据您的结构当前的定义方式,您需要这样做:

strcpy(germany.countryname, "Germany"); 
strcpy(germany.state.statename, "Bavaria");
strcpy(germany.state.city.cityname, "ingolstadt");
strcpy(germany.state.city.shop.shopname, "Westpark");

定义结构的更好方法是这样的:

   struct shop {
        char countryname[100];
        char statename[100];
        char cityname[100];
        int postal;
        char shopname[100];
    };

那么你可以这样做:

struct shop myshop;

strcpy(myshop.countryname, "Germany"); 
strcpy(myshop.statename, "Bavaria");
strcpy(myshop.cityname, "ingolstadt");
strcpy(myshop.shopname, "Westpark");

当你在这个上下文中写 struct Y

struct X {
    struct Y {
        int z;
    } y;
} x;

你做了两件事:

  • 定义 struct Y
  • struct X.
  • 中添加 struct Y 类型的字段 y

你定义的四个struct是相互独立的。您的每个 struct 都定义了一个商店,因为您的 struct country.

中没有集合

以下是如何使用您定义的结构来定义您的商店:

// This is what the structure dictates, probably not what you want
struct country westpark;
strcpy(westpark.countryname, "Germany");
strcpy(westpark.state.statename, "Bavaria");
strcpy(westpark.state.city.cityname, "Ingolstadt");
strcpy(westpark.state.city.shop.shopname, "Westpark");

虽然这看起来不像您想要的任何东西。我想你正在寻找这样的东西:

struct country {
    char countryname[100];
    struct state {
        char statename[100];
        struct city {
            char cityname[100];
            int postal;
            struct shop {
                char shopname[100];
            } shop[MAX_SHOP]; // maybe 128
            int shopCount;
        } city[MAX_CITY];     // Around 256
        int cityCount;
    } state[MAX_STATE];       // Probably 16
    int stateCount;
} country;

这里的想法是将国家构造为州数组,将州构造为城市数组,将城市构造为商店数组。此层次结构的每个级别还存储其级别中的项目计数,即 stateCount 计算 state[] 数组中有多少元素已被填充,每个 state[] 存储中的 cityCount已填充的 city[] 个元素的数量,依此类推。

这个 struct 的大小大约是 50MB,所以不要让它成为自动局部变量:它应该是外部作用域静态或函数作用域静态,因为 50 MB在大多数系统上,堆栈 space 太多了。以下是如何将您的商店添加到此 struct:

strcpy(country.countryname, "Germany");
country.stateCount = 1; // For Bavaria
strcpy(country.state[0].statename, "Bavaria");
country.state[0].cityCount = 1; // For Ingolstadt 
strcpy(country.state[0].city[0].cityname, "Ingolstadt");
country.state[0].city[0].shopCount = 1; // for Westpark
strcpy(country.state[0].city[0].shop[0].shopname, "Westpark");

请注意,这是非常低效的,因为它会预先分配最大的所有内容。因此,代表不来梅和巴伐利亚的 state[] 数组的元素最终将具有相同数量的预分配 city[] 元素,即使巴伐利亚要大得多,并且可能需要更多的城市条目。要以资源高效的方式处理此问题,您需要使用动态内存分配。