题目:点击打开链接
解决方案:
//6:55 pm --> 7:32 pm
//2017/3/5
#include <stdio.h>
#include <stdlib.h>
int orderTable[26];
char elem[100][21];
//当s1应该排在s2前面的时候,
//则返回负数,否则返回正数
//由于题目中说了,不会出现相同的字串的,
//所以不用考虑返回0的情况
int cmp(const void * a, const void * b){
char *s1,*s2;
char c1,c2;
s1 = (char *)a;
s2 = (char *)b;
while(*s1 && *s2){
//统一转换为大写字母
c1 = (*s1 >= 'a') ? (*s1 + ('A'-'a')) : *s1;
c2 = (*s2>='a') ? (*s2 + ('A'-'a')) : *s2;
if(c1 != c2) return (orderTable[c1-'A'] - orderTable[c2-'A']);
s1++;
s2++;
}
if(*s1 == '\0') return -1;
else return 1;
}
int main(){
char orderInput[27];
int i,count,j;
char str[2201];
while(scanf("%s\n",orderInput)!=EOF){
//将顺序表处理一下,然后保存到orderTable里面去
for(i=0;i<26;i++){
orderTable[orderInput[i]-'A']=i;
}
//读入一行带排序的字符串,他们用空格分开
gets(str);
//用i来扫描str数组。用count来表示读入了多少个数,
//用j表示把当前的字符放在数组的哪个小位置
i = 0;
count = 0;
while(1){
j = 0;
while(str[i] != ' ' && str[i] != '\0'){
elem[count][j] = str[i];
j++;
i++;
}
elem[count][j] = '\0';
count++;
if(str[i] == '\0'){break;}
else i++;
}
qsort(elem,count,sizeof(elem[0]),cmp);
for(i=0;i<count-1;i++){
printf("%s ",elem[i]);
}
printf("%s\n",elem[i]);
}
return 0;
}
值得一提的是:
- scanf("%s\n",s); 这个把换行符都读掉了,也就是说从输入流里面去除了。否则的话,换行符还会留在输入流里面。
- gets(str);这个gets函数其实是有返回值的,当读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL 指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。
-
qsort的函数原型: void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void* ) ) ;各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针