2011-04-11 97 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