C中的结构,“没有成员命名...”错误

时间:2015-09-17 13:23:33

标签: c struct strcpy

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

  

结构国家/地区没有名为bavaria的成员

所以似乎错误发生在这里: 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;
}

5 个答案:

答案 0 :(得分:3)

让我们将定义与用于更容易阅读的地方分开:

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");

答案 1 :(得分:1)

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

你现在可以做到

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

strcpy(westpark, "Westpark");

通常,struct成员名称是编译时间的东西。它们被解决以解决编译器的偏移问题。您的城市/州/商店名称是运行时数据。您不能将它们用作结构成员。

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

答案 2 :(得分:1)

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

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

可能会起作用(但可能不会按你的意愿行事)。

答案 3 :(得分:1)

根据结构当前的定义方式,您需要执行以下操作:

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");

答案 4 :(得分:1)

在此上下文中编写struct Y

struct X {
    struct Y {
        int z;
    } y;
} x;
你做了两件事:

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

您定义的四个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[]数组中已填充的元素数,cityCountstate[]个商店已填充的city[]元素的数量,等等。

这个struct的大小大约是50MB,所以不要把它变成一个自动的局部变量:它应该是一个外部作用域静态或一个函数作用域静态,因为50 MB也是大多数系统上的大部分堆栈空间。您可以通过以下方式将商店添加到此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[]元素结束,尽管巴伐利亚州要大得多,并且可能需要更多城市条目。要以资源有效的方式处理这个问题,您需要使用动态内存分配。