字符串的排序模拟:
以后最好都用 qsort。这里用sort排序出来的结果不对。sort 是用大于小于号来返回bool值进行排序。qsort 则返回int类型,从而进行排序
PS:升序用后一个减去前一个
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; struct Weapon { char name[21]; char origin[21]; char harm[21]; }; Weapon weapon[501]; //int cmp(Weapon a, Weapon b) { int cmp(const void *c, const void *d) { Weapon *a = (Weapon*) c; Weapon *b = (Weapon*) d; if(!strcmp(a->origin, b->origin)) { if(!strcmp(a->harm, b->harm)) { return strcmp(a->name, b->name); } else { if('w' == a->harm[0]) { return -1; } else if('w' == b->harm[0]) { return 1; } else if('g' == a->harm[0]) { return -1; } else if('g' == b->harm[0]) { return 1; } else if('s' == a->harm[0]) { return -1; } else if('s' == b->harm[0]) { return 1; } } } return strcmp(a->origin, b->origin); } int main() { int n; int cse, i; cse = 1; while(scanf("%d", &n) != EOF) { int flag = 0; char str[21]; for(i = 0; i < n; i++) { scanf("%s%s%s", weapon[i].name, weapon[i].origin, weapon[i].harm); } qsort(weapon, n, sizeof(Weapon), cmp); /* printf("\n"); for(i = 0; i < n; i++) { printf("%s %s %s\n", weapon[i].name, weapon[i].origin, weapon[i].harm); }*/ printf("Case %d\n", cse++); strcpy(str, weapon[0].origin); flag = 1; for(i = 0; i < n; i++) { if(strcmp(str, weapon[i].origin)) { flag = 1; strcpy(str, weapon[i].origin); } if(!strcmp(str, weapon[i].origin) && 1 == flag) { printf("%s:\n", weapon[i].origin); flag = 2; } if(2 == flag) { printf(" %s %s\n", weapon[i].name, weapon[i].harm); } } } return 0; }