【问题标题】:Making a Tuple in C用 C 创建一个元组
【发布时间】:2014-05-08 18:36:08
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 如果你想保留不同的类型,使用 void 指针和 malloc 最终会更干净(从长远来看)。然后我做了 40 多年,所以对我来说似乎更干净。
      • 我不太明白你的提议。在现实世界的应用程序中,数据可能需要重新调整大小,或者使用通用接口。但我认为在此处添加任何内容都会使示例更加晦涩。
      • 我为可动态调整大小的数组和字典编写了代码,令人惊讶的是,它可以在现实世界的应用程序中使用。但是,同样,这完全取决于您的经验水平、您对指针的舒适度等。
      • 同意。我不推荐这是最好的选择,只是需要注意的事情。我几乎总是使用struct 进行封装。
      猜你喜欢
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2021-04-11
      相关资源
      最近更新 更多