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" を忘れる必要があります。誰かがエレガントな方法でこれを行う方法を理解するのを手伝ってもらえますか?

4

2 に答える 2

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);
    }
于 2012-06-06T02:20:08.843 に答える
0

比較の前に、名前の一時コピーから無視したい単語を削除する関数を作成しますか?

次に、処理された名前を単純に比較します。

これは、スペースで分割することでそのような関数を実装するのに十分単純であり、単語を出力文字列に押し込む前にその単語が「有効な単語」であることを確認する必要があると思います。

于 2012-06-06T02:20:10.177 に答える