笨拙的数据结构

时间:2011-04-11 16:38:21

标签: c data-structures

我正在编写一个实用程序,它使用制表符分隔的文本文件并输出HTML表。部分功能是能够在命令提示符下传递过滤器值。因此,例如,如果我们有一个列“A”,我应该能够传递--filter“A”“foo”,并且只能看到“A”列包含“foo”的行。

这让我想到了我的问题。我用C语言写这篇文章,也许是由于我对语言经验不足,我无法表达我的“过滤器”数据结构。

我最初的问题是预先存储过滤器:

//Parse parameters and values, i.e. --start, --length
for (; i<argc; i++){
    if (argv[i][1] == '-'){
        argv[i]++; //Strip long options 
        if (i+1 == argc || argv[i+1][0] == '-'){
                fprintf(stderr, "Error: Missing argument to optional parameter!\n");
                exit(1);
        }
    }
    if (strcmp(argv[i], "-start")==0)
        start = strtol(argv[i+1], NULL, 0);
    else if (strcmp(argv[i], "-length")==0)
        length = strtol(argv[i+1], NULL, 0);
    else if (strcmp(argv[i], "-filter")==0){ //Store the filter arguments for later processing
        filters = realloc(filters, sizeof(char*) * (f+2));
        filters[f++] = strdup(argv[i+1]);
        filters[f++] = strdup(argv[i+2]);
    }
}

然后,一旦我有了列名,就创建一个稀疏填充的过滤器值数组,这些数组对应于文件头的长度。所以,如果我正在查看第4列,我会查找过滤器数组的第四个值,并检查它是否填充了值。

将过滤器的“初始”存储扩展到此查找表的代码如下:

//Now that we know how many cols we have, create a sparsely populated filter array
for (j=0,i=0; i<ncols; i++){
    filtercols = realloc(filtercols, sizeof(char*) * (ncols+1));
    filtercols[i] = strdup("");
    for (c=0; c<f; c++){
        if (strcmp(columns + j, filters[c])==0){
            filtercols[i] = strdup(filters[c+1]);
            break;
        }
    }

    while (columns[j]){
        j++;
    }
    j++;
}

除了尴尬之外,我可以看到,如果我指定的过滤器对列名和过滤器值都具有相同的值,那么这将不起作用。

在像Python这样的东西中,我会用字典处理这个问题。在C语言中工作时,这种情况的最佳成语是什么?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

你可以使用哈希:

http://uthash.sourceforge.net/