华师大 OJ 2896

题目:点击打开链接

解决方案:

//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;
}



值得一提的是:

  1. scanf("%s\n",s); 这个把换行符都读掉了,也就是说从输入流里面去除了。否则的话,换行符还会留在输入流里面。
  2. gets(str);这个gets函数其实是有返回值的,当读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL 指针。所以在遇到返回值为NULL的情况,要用ferrorfeof函数检查是发生错误还是遇到EOF。
  3. qsort的函数原型: void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void* ) ) ;
    各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值