在C中按名称和数字引用数据

时间:2009-11-10 04:52:50

标签: c

我有二十个左右的整数,我希望能够在设置时通过名称来引用它们,但是我也希望能够像数字一样用数字来引用它们,所以我可以使用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这样的低级语言?

8 个答案:

答案 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)

嗯......根据你伪编码的内容你可能会使用一个联盟。其他人给出的答案似乎是围绕允许名称和数字之间的映射。如果那就是你要找的东西(比如,能够打印名字)那么他们的答案会更好。然而,对我而言,你只是在寻找代码的清晰度,以便你能够通过名称或数字来引用事物,在这种情况下,我认为联盟是理想的。这正是像C这样的低级语言允许你这样做的事情。

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读了一些其他的答案,那些可能实际上比这更简单/更容易......但是工会仍然值得了解。