我正在编写一个实用程序,它使用制表符分隔的文本文件并输出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语言中工作时,这种情况的最佳成语是什么?
感谢您的时间。