2012-06-06 27 views
0
#define alen(x) ((sizeof x)/(sizeof *x)) 

typedef struct { 
    char *movie_title; 
    int minutes; 
    float price; 
} DVD; 

int 
main() 
{ 
    DVD movies[10] = { 
     { "The Dark Knight", 153, 14.99}, 
     { "Iron Man", 126, 12.99}, 
     { "Batman Begins", 141, 9.99}, 
     { "Batman Returns", 126, 9.99}, 
     { "Teenage Mutant Ninja Turtles", 87, 7.99}, 
     { "The Incredible Hulk", 114, 12.99}, 
     { "X-Men", 104, 12.99}, 
     { "Spider-Man", 121, 14.99}, 
     { "Fantastic Four", 106, 14.99}, 
     { "Captain America", 124, 19.99}, 
    }; 

    qsort(movies, alen(movies), sizeof *movies, tcomp); 

    printf("Movies sorted: \n"); 
    for (int i = 0; i < alen(movies); i++) 
     printf("%s\n", movies[i].movie_title); 
} 

int 
tcomp (const void * a, const void * b) 
{ 
    return strcmp(((DVD*)a)->movie_title,((DVD*)b)->movie_title); 
} 

當使用函數tcomp和qsort對電影標題進行排序時,我需要忘記電影標題中的「A」,「An」和「The」。有人能幫我弄清楚如何以優雅的方式做到這一點?在C中使用qsort()並跳過特定字符集

+0

比較之前剝離... –

回答

3

如果你只關心前綴的話,那你就比較之前,調整指針

char* skip_irrelvant(char* s) 
{ 
    while(*s == ' ') s++; 
    if(strnicmp(s, "The ", 4)==0) s+=4; 
    return s; 
} 


    int tcomp (const void * a, const void * b) 
    { 
     char* s1 = ((DVD*)a)->movie_title; 
     char* s2 = ((DVD*)b)->movie_title; 
     s1 = skip_irrelvant(s1); 
     s2 = skip_irrelvant(s2); 

     return strcmp(s1, s2); 
    } 
+0

它說隱式聲明的功能「strnicmp」在C99無效?我包括標題,所以你有什麼想法爲什麼?! – Jordan

+0

只要在任何情況下使用strcmp!謝謝! – Jordan

+0

哦對,對不起,在這種情況下,先將其轉換爲較低,否則將區分大小寫 –

0

寫一個函數在比較前剝去你的通緝忽略的詞出了名的臨時副本?

然後簡單地比較處理過的名稱。

我想這應該足夠簡單,通過分割空格來實現這樣的功能,然後確保該單詞在將單詞推入輸出字符串之前是「有效單詞」。

+0

無需剝離。只需增加字符指針。 – Will