我有二十个左右的整数,我希望能够在设置时通过名称来引用它们,但是我也希望能够像数字一样用数字来引用它们,所以我可以使用for循环逐个打印出来。任何想法如何在C中编码?以下是我在伪代码中所说的内容:
/* a data structure to keep a count of each make of car I own */
my_cars;
/* set the counts */
my_cars.saabs = 2;
my_cars.hondas = 3;
my_cars.porsches = 0;
/* print the counts */
for(all i in my_cars) {
print my_cars[i];
}
这是否过多地要求像C这样的低级语言?
答案 0 :(得分:7)
struct car {
const char *name;
int count;
} my_cars[] = {{"Saab", 2}, {"Honda", 3}, {"Porsche", 0}};
int i;
for (i = 0; i < sizeof(my_cars) / sizeof(my_cars[0]); i++)
printf("%s: %d\n", my_cars[i].name, my_cars[i].count);
答案 1 :(得分:6)
为此,您应该使用数组而不是独立数据字段
#include <stdio.h>
typedef enum CarType {
CART_SAAB,
CART_HONDA,
CART_PORSHE,
CART_COUNT_
} CarType;
typedef struct MyCars {
unsigned ncars[CART_COUNT_];
} MyCars;
int main(void)
{
MyCars my_cars = { 0 } ;
unsigned i;
my_cars.ncars[CART_SAAB] = 2;
my_cars.ncars[CART_HONDA] = 3;
for (i = 0; i < CART_COUNT_; ++i)
printf("%u\n", my_cars.ncars[i]);
return 0;
}
答案 2 :(得分:5)
C可以做任何其他语言都可以做的事情。这确实看起来像家庭作业,我打赌你应该用钥匙做一些东西。请记住,您的教师希望您使用他或她试图教您的数据结构。他并不是真的希望以任何随机的方式解决问题,他希望它能够解决你所讨论的主题。
因此,请考虑包含字符串和计数的数据结构,可以搜索的数据结构,并提供执行此操作的功能。你可能会得到的是这个问题的好,专业,简单的解决方案。那不是你教练想要的......
答案 3 :(得分:3)
enum Makes { SAAB, HONDA, PORSCHE, INVALID };
int my_cars[INVALID];
my_cars[SAAB] = 2;
my_cars[HONDAS] = 3;
my_cars[PORSCHE] = 0;
答案 4 :(得分:1)
您需要两个数据结构。用于保存数字的数组,以及从名称到数组中索引的映射。在C ++中,您将使用标准库中的一个映射类。我不知道C中有什么可用,但我确信有可用的地图实现。
答案 5 :(得分:1)
执行此操作的低级C方法是将汽车结构包装成一个联合:
// define a structure for the cars.
typedef struct
{
int saabs;
int hondas;
int porsches;
} cars;
// wrap it into a union:
typedef union
{
cars byname;
int byid[3]; // Note: Number and type must match with the cars structure.
} cars2;
int main (int argc, char **arg)
{
cars2 my_cars;
int i;
// fill out by name:
my_cars.byname.saabs = 1;
my_cars.byname.hondas = 5;
my_cars.byname.porsches = 3;
// print by index:
for (i=0; i<3; i++)
printf ("%d\n", my_cars.byid[i]);
}
答案 6 :(得分:0)
可能有几种选择。
可以以两种不同的方式在内存中定义(和使用)相同的空间。换句话说,您可以拥有一个带有命名成员的结构,并将其作为结构或数组引用,具体取决于您打算如何解决它。
或者,您可以使用枚举的typedef来命名数组中的位置,例如
typedef enum {
SABS = 0,
HONDAS,
PORSCHES
} cars;
然后,这将允许您按名称引用数组中的偏移量,例如
mycars[SABS] = 5;
答案 7 :(得分:0)
union my_cars {
struct names {
int saab;
int ford;
...
}
int[NUM_MAKES] nums;
}
您必须小心确保NUM_MAKES与您定义的品牌数量保持同步。然后你可以做类似的事情:
my_cars.names.saab = 20;
my_cars.nums[0] = 30;
修改相同的元素。
仅供参考,我的C有点生疏,因此可能存在语法错误,请随时纠正。
编辑:
啊,我使用ENUM或DEFINE读了一些其他的答案,那些可能实际上比这更简单/更容易......但是工会仍然值得了解。