我正在编写一个实用程序,它使用制表符分隔的文本文件并输出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中工作时,这种情况的最佳成语是什么?
谢谢你的时间。
不回答实际问题,但我认为你应该使用POSIX兼容的'getopt的()'或'getopt_long()'进行适当的功能(和更容易)参数处理。 小指南在这里:http://www.gnu.org/s/libc/manual/html_node/Getopt.html – 2011-04-11 22:47:35
请注意,'strtol'函数需要所需输出的数字库作为其第三个参数,所以我推荐'length = strtol(argv [i + 1],NULL,10);' – pr1268 2011-04-12 00:08:15
Yikes!为什么在循环的每次迭代中重新分配?你几乎总是可以做得比这更好。你需要知道如何在c中实现动态数组吗? – dmckee 2011-04-12 01:21:23