我正在編寫一個實用程序,它使用製表符分隔的文本文件並輸出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