2011-04-11 56 views
2

我正在编写一个实用程序,它使用制表符分隔的文本文件并输出HTML表格。部分功能是在命令提示符处传递过滤器值的功能。因此,例如,如果我们有一列“A”,我应该能够传递 - 过滤“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

不回答实际问题,但我认为你应该使用POSIX兼容的'getopt的()'或'getopt_long()'进行适当的功能(和更容易)参数处理。 小指南在这里:http://www.gnu.org/s/libc/manual/html_node/Getopt.html – 2011-04-11 22:47:35

+0

请注意,'strtol'函数需要所需输出的数字库作为其第三个参数,所以我推荐'length = strtol(argv [i + 1],NULL,10);' – pr1268 2011-04-12 00:08:15

+0

Yikes!为什么在循环的每次迭代中重新分配?你几乎总是可以做得比这更好。你需要知道如何在c中实现动态数组吗? – dmckee 2011-04-12 01:21:23

回答

2

你可以只用一个hash:

http://uthash.sourceforge.net/

+0

这是一个明显的解决方案,因为hashmaps通常是像python字典这样的关联数组的基础数据结构。 – dmckee 2011-04-12 01:23:45

+0

我决定用我原来的代码去做,因为它很尴尬。结合一个外部库,可能比实用程序本身更多的代码看起来像是过度杀毒。虽然uthash确实很有趣。 – zchtodd 2011-04-12 12:46:27