在C中制作元组

时间:2014-03-29 05:24:43

标签: c tuples bind associative-array key-value

我现在遇到一个问题,我试图将一个字符串绑定到一个值。在C中关联这些值的最简单方法是什么?我本质上想要一个像元组一样的Python,我可以添加到列表中。

2 个答案:

答案 0 :(得分:22)

这就是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)例如检查字符串长度和数组计数是否溢出,或禁止重复键(如果需要)。

答案 1 :(得分:1)

关联不同类型值的另一种方法是创建并行数组。每个类型化元素的一个数组,通过具有相同的索引关联。

char *strVal[5];
int intVal[5];

因此strVal[0]intVal[0]相关联,依此类推。

这种表示元组的方式甚至可以应用于没有structrecord类型的语言。