指针数组几乎能解决很多问题,但是我任然有个比较蠢的办法。更新了一下。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_VARIABLES 100
typedef struct
{
char name[8];
int age;
} A;
typedef struct
{
char *name;
void *value;
} KeyValue;
typedef struct
{
KeyValue kv[MAX_VARIABLES];
int size;
} Map;
Map map;
void map_init(Map *map)
{
map->size = 0;
}
void map_put(Map *map, const char *name, void *value)
{
if (map->size == MAX_VARIABLES)
{
fprintf(stderr, "Error: Map full\n");
exit(1);
}
KeyValue *kv = &map->kv[map->size++];
kv->name = strdup(name);
kv->value = value;
}
void *map_get(Map *map, const char *name)
{
for (int i = 0; i < map->size; i++)
{
if (strcmp(name, map->kv[i].name) == 0)
{
return map->kv[i].value;
}
}
fprintf(stderr, "Error: Variable '%s' not found\n", name);
exit(1);
}
A *set_A(const char *var_name, const char name[8], int age)
{
A *a = (A *)malloc(sizeof(A));
strcpy(a->name, name);
a->age = age;
map_put(&map, var_name, a);
return a;
}
A *get_A(const char *var_name)
{
return (A *)map_get(&map, var_name);
}
int main()
{
map_init(&map);
A *A1 = set_A("A1", "张三", 18);
A *A2 = set_A("A2", "李四", 19);
A *A3 = set_A("A3", "王五", 20);
for (int i = 1; i < 4; i++)
{
char var_name[4];
sprintf(var_name, "A%d", i);
A *a = get_A(var_name);
printf("name: %8s; age: %d\n", a->name, a->age);
}
return 0;
}
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_VARIABLES 100
typedef struct
{
char name[8];
int age;
} A;
typedef struct
{
char *name;
void *value;
} KeyValue;
typedef struct
{
KeyValue kv[MAX_VARIABLES];
int size;
} Map;
Map map;
void map_init(Map *map)
{
map->size = 0;
}
void map_put(Map *map, const char *name, void *value)
{
if (map->size == MAX_VARIABLES)
{
fprintf(stderr, "Error: Map full\n");
exit(1);
}
KeyValue *kv = &map->kv[map->size++];
kv->name = strdup(name);
kv->value = value;
}
void *map_get(Map *map, const char *name)
{
for (int i = 0; i < map->size; i++)
{
if (strcmp(name, map->kv[i].name) == 0)
{
return map->kv[i].value;
}
}
fprintf(stderr, "Error: Variable '%s' not found\n", name);
exit(1);
}
A *set_A(const char *var_name, const char name[8], int age)
{
A *a = (A *)malloc(sizeof(A));
strcpy(a->name, name);
a->age = age;
map_put(&map, var_name, a);
return a;
}
A *get_A(const char *var_name)
{
return (A *)map_get(&map, var_name);
}
int main()
{
map_init(&map);
A *A1 = set_A("A1", "张三", 18);
A *A2 = set_A("A2", "李四", 19);
A *A3 = set_A("A3", "王五", 20);
for (int i = 1; i < 4; i++)
{
char var_name[4];
sprintf(var_name, "A%d", i);
A *a = get_A(var_name);
printf("name: %8s; age: %d\n", a->name, a->age);
}
return 0;
}
【 在 sqsl 的大作中提到: 】
: 下面是一段错误的代码,错误在Ai那,这么写是想反印我的意图:依次打印出A1,A2,
: A3的年纪。因为有几百人,一个一个去打印很麻烦,所以想像数组那样操作,请问有什
: 么简便的办法嘛?谢谢
: ...................
--
修改:CduVgg FROM 183.185.20.*
FROM 183.185.20.*