首先進行單詞的大寫轉小寫,然後重排,所以得保存兩份單詞進行操作。當然,還要標記這個單詞重排後是否出現兩次,所以還需要一個flag作為標記。處理完成後,最後還需要按照原先單詞的字典順序輸出,所以還需要排一次序。 [cpp] #include <stdio.h> #include <stdlib.h> #include <string.h> struct _s { char a[25]; char b[25]; bool flag; }s[10000]; void trans(char st[]) { int len = strlen(st); // 大寫轉小寫 for (int i=0; i<len; i++) if (st[i]>='A' && st[i]<='Z') st[i] += ('a'-'A'); // 冒泡排序 for (int i=len; i>0; i--) for (int j=0; j<i; j++) { if (st[j] < st[j-1]) { char tmp = st[j]; st[j] = st[j-1]; st[j-1] = tmp; } } } // 根據b排序 int cmp_b(const void *_a, const void *_b) { struct _s *a = (struct _s*)_a; struct _s *b = (struct _s*)_b; return strcmp(a->b, b->b); } // 根據a排序 int cmp_a(const void *_a, const void *_b) { struct _s *a = (struct _s*)_a; struct _s *b = (struct _s*)_b; return strcmp(a->a, b->a); } int main() { char st[25]; int n = 0; while (scanf("%s", st)) { if ('#' == st[0]) break; strcpy(s[n].a, st); trans(st); strcpy(s[n].b, st); n++; } qsort(s, n, sizeof (s[0]), cmp_b); for (int i=1; i<n; i++) if (0 == strcmp(s[i].b, s[i-1].b)) { s[i].flag = 1; s[i-1].flag = 1; } qsort(s, n, sizeof (s[0]), cmp_a); for (int i=0; i<n; i++) { if (!s[i].flag) printf("%s\n", s[i].a); } return 0; }