【发布时间】:2014-05-08 18:36:08
【问题描述】:
我现在有一个问题,我试图将字符串绑定到一个值。在 C 中关联这些值的最简单方法是什么?我本质上想要一个可以添加到列表中的 Python 之类的元组。
【问题讨论】:
标签: c tuples bind associative-array key-value
我现在有一个问题,我试图将字符串绑定到一个值。在 C 中关联这些值的最简单方法是什么?我本质上想要一个可以添加到列表中的 Python 之类的元组。
【问题讨论】:
标签: c tuples bind associative-array key-value
这就是 C 结构的用途。例如,以下结构是一个元组,它将一个字符串(最多 20 个字符长)绑定到一个整数值:
typedef struct {
char strVal[21];
int intVal;
} tTuple;
tTuple 类型的变量(或指向它们的指针,如果它们是动态分配的)可以被传递、添加到列表中,并以任何对您的情况有意义的方式进行操作。
使用与上述类似的结构,下面的完整程序显示了这一点。它可能可以做一些更健全的检查(a),但应该很好地展示如何做一个元组(这是问题所要问的):
#include <stdio.h>
#include <string.h>
static struct { char strVal[21]; int intVal; } tuple[10];
static int tupleCount = 0;
static void listTuples(void) {
printf("==========\nTuple count is %d\n", tupleCount);
for (int i = 0; i < tupleCount; ++i)
printf(" [%s] -> %d\n", tuple[i].strVal, tuple[i].intVal);
puts("==========");
}
static void addTuple(char *str, int val) {
printf("Adding '%s', mapped to %d\n", str, val);
strcpy(tuple[tupleCount].strVal, str);
tuple[tupleCount++].intVal = val;
}
static void deleteTuple(char *str) {
int index = 0;
while (index < tupleCount) {
if (strcmp(str, tuple[index].strVal) == 0) break;
++index;
}
if (index == tupleCount) return;
printf("Deleting '%s', mapped to %d\n", str, tuple[index].intVal);
if (index != tupleCount - 1) {
strcpy(tuple[index].strVal, tuple[tupleCount - 1].strVal);
tuple[index].intVal = tuple[tupleCount - 1].intVal;
}
--tupleCount;
}
int main(void) {
listTuples();
addTuple("aardvark", 31);
addTuple("buffalo", 41);
addTuple("camel", 59);
addTuple("dingo", 27);
listTuples();
deleteTuple("buffalo");
listTuples();
return 0;
}
那个程序的输出是:
==========
Tuple count is 0
==========
Adding 'aardvark', mapped to 31
Adding 'buffalo', mapped to 41
Adding 'camel', mapped to 59
Adding 'dingo', mapped to 27
==========
Tuple count is 4
[aardvark] -> 31
[buffalo] -> 41
[camel] -> 59
[dingo] -> 27
==========
Deleting 'buffalo', mapped to 41
==========
Tuple count is 3
[aardvark] -> 31
[dingo] -> 27
[camel] -> 59
==========
(a) 例如检查字符串长度和数组计数是否溢出,或禁止重复键(如果需要)。
【讨论】:
关联不同类型值的另一种方法是创建并行数组。每个类型元素对应一个数组,通过相同的索引关联。
char *strVal[5];
int intVal[5];
所以strVal[0] 与intVal[0] 相关联,依此类推。
这种表示元组的方式甚至可以在没有struct 或record 类型的语言中应用。
【讨论】:
struct 进行封装。