我正在尝试创建一个包含国家,州,城市和本地商店名称的结构。不幸的是,我收到了这个错误:
结构国家/地区没有名为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;
}
答案 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)
变量bavaria
,ingolstadt
和westpark
是单独的项目,而不是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[]
数组中已填充的元素数,cityCount
个state[]
个商店已填充的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[]
元素结束,尽管巴伐利亚州要大得多,并且可能需要更多城市条目。要以资源有效的方式处理这个问题,您需要使用动态内存分配。