2010-08-04 125 views
0

分組字符串我有一大堆的字符串看起來像:Ç - 在一個結構

'Hello1-FOO', 'Aello2-FOO', 'Bye1-BAR', 'Bye3-BAR', 'Hello22-FOO', 'Bye4-BAR', 'Welcome-BAR' ...

所有這些都存儲在一個結構。

struct str { 
    char *strings; 
} 
... 
struct str **t_str; 
size_t j; 
t_str = malloc(sizeof *t_str * 20); 
for (j = 0; j < 20; j++) 
    t_str[j] = malloc(sizeof *t_str[j]); 
... 
t_str[0]->strings = "Hello1-FOO"; 
t_str[1]->strings = "Aello2-FOO"; 
.... 

我想什麼做的是按類別顯示(排序)他們,使他們看起來與此類似:後

FOO: 
Hello1-FOO 
Aello2-FOO 
Hello22-FOO 

BAR: 
Bye4-BAR 
Welcome-BAR 
Bye1-BAR 
Bye3-BAR 

基本上它們分組令牌「 - 」

這樣做的好方法是什麼?我應該在處理字符串後將它們存儲在第二個結構中嗎?任何想法將不勝感激。謝謝

+1

第一件要解決的問題是,你的結構只允許一個字符串。如果這是真正的代碼,你還沒有足夠的時間來解決這個問題。 – 2010-08-04 15:08:39

+0

@David Thornley:我已經爲上面提到的所有字符串分配了內存。我可以毫無問題地顯示它們(未分組)。我只想評論他們在哪裏舉行。 – Frank 2010-08-04 15:14:45

+0

那麼你對每個字符串都有一個'str'實例嗎?這就是你的代碼的樣子,但是描述聽起來像是想將所有字符串存儲在單個'str'實例中 – 2010-08-04 15:23:41

回答

1

只需使用qsort。下面的代碼做了一些假設,但你應該能夠改變它以適應你的需求。

int categoryComparitor(const void * a, const void * b) 
{ 
    char *string1 = (char *)a; 
    char *string2 = (char *)b; 

    string1 = strrchr(string1, '-') + 1; 
    string2 = strrchr(string2, '-') + 1; 

    return strcmp(string1, string2); 
} 


{ 
    ... 
    char *strings[]; // Array of string pointers 
    int stringCount; // Holds current number of valid elements in strings. 
    ... 
    qsort(strings, stringCount, sizeof(char *), categoryComparitor); 
} 
+0

+1使用標準的庫函數而不是重新創建。 – schot 2010-08-04 15:29:50

0

正如大衛·索恩利已經指出的那樣,你struct是不是真的定義良好的處理這種情況(以及所有)。由於您的輸入是兩個獨立的邏輯片段,因此您確實需要相應地定義結構 - 包含兩個單獨的字符串,輸入的每個部分都有一個字符串。

struct record { 
    char *category; 
    char *string; 
}; 

然後你想每一塊讀入這兩個字符串之一:

record read_line(FILE *infile) { 
    char buffer1[128], buffer2[128]; 
    fscanf(infile, "%[^-]-%s", buffer1, buffer2); 
    record ret; 
    ret.string = dupe_string(buffer1); 
    ret.category = dupe_string(buffer2); 
    return ret; 
} 

然後,對這些記錄進行排序,你要定義與qsort預期的簽名進行比較的功能,這並不在category部件上的比較:

int cmp(void *a, void *b) { 
    return strcmp(((record *)a)->category, ((record *)b)->category); 
} 

然後你會使用比較函數排序您的record列數組。