练习3-3


#include <stdio.h>
#include <stdlib.h>


/*
编写函数char *expand(const char *ss,char *ds),将字符串ss中类似于a-z一类的速记符号在字符串ds
中扩展为等价的完整列表abcdef...z.此函数可以处理大小写字母和数字,并可以处理
a-b-c,a-z0-9与-a-z等类似的情况.作为前导和尾随的-字符原样排印.
给出几个范例:
a-f    >  abcdef
f-a    >  fedcba
a-f-a  >  abcdefedcba
a-A    >  a-A
a-9-0  >  a-9876543210
a--b   >  a--b
-a-c   >  -abc
a-a    >  a-a
其中 > 右边的字符为经过转换后的字符
*/
char *expand(const char *ss, char *ds)
{
 char *ds_head=ds;
 const char *iter,*iter_l;
 char temp;

 if(ss==NULL)return  NULL;
 if(ds==NULL)return  NULL;/****异常!!!*******/
 if(ss==ds  )return  NULL;/*错误,不能通过ds来修改ss,保护原来的ss*/
 /**********************************************************/
 if(*ss=='-')*ds++=*ss++;/*当串第一个位置就是'-'时*/
 for(;*ss!='/0';ss++)
 {
  if(*ss=='-'){
   iter=ss-1; iter_l=ss+1;   

   if(*iter_l>='0' && *iter_l<='9'   &&
        *iter>='0' && *iter<='9'  &&
     *iter!=*iter_l   )
   {/*-数字***************
    *********************/
    if(*iter<*iter_l){/*升序 0-9*/
     --ds;
     for(temp=*iter;temp<*iter_l;temp++){
      *(ds++)=temp;
     }
     continue;
    }
    /*降序 9-0 */
    --ds;
    for(temp=*iter;temp>*iter_l;temp--){
     *(ds++)=temp;
    }
    continue;
   }/*数字结束*************
             **********************/
   else if(*iter_l>='a'&&*iter_l<='z' &&
        *iter>='a'  &&*iter<='z'   &&
     *iter!=*iter_l)
   {/*-小写字母**********
    ********************/
    if(*iter<*iter_l){/*升序 a-z */
     --ds;
     for(temp=*iter;temp<*iter_l;temp++){
      *(ds++)=temp;      
     }
     continue;
    }
    /*降序 z-a  */
    --ds;
    for(temp=*iter;temp>*iter_l;temp--){
     *(ds++)=temp;
    }
    continue;
   }/******小写字母结束****
    **********************/
   
   else if(*iter_l>='A'&&*iter_l<='Z'  &&
        *iter>='A'  &&*iter<='Z'    &&
     *iter!=*iter_l)
   {/*-大写字母**********
    ********************/
    if(*iter<*iter_l){/*升序 A-Z  */
     --ds;
     for(temp=*iter;temp<*iter_l;temp++){
      *(ds++)=temp;
     }
     continue;
    }
    /*降序 Z-A  */
    --ds;
    for(temp=*iter;temp>*iter_l;temp--){
     *(ds++)=temp;
    }
    continue;
   }/****大写字母结束*****
    *********************/

   else{/*都不是,则复制-*/
    *(ds++)='-';    
   }

  }/*if结束 */
  else{/*照原样复制*/
   *(ds++)=*ss;
  }
 }/*for结束*/


 /*ds最后的位置加上'/0'*/
 *ds='/0';

 return ds_head; 
}
/*
这个函数中有一段程序虽可用内联写,但考虑到参数传递代来的浪费,就没写了,所以有点冗余
*/
int main(void)
{
 char a[100000]="--------a-zz-aA-ZZ-A0-99-09-aa-b--------a";
 char b[100000];
 char *c;
 printf("1:%s/n",a);
 c=expand(a,b);
 printf("2:%s/n",c);
 printf("3:%s/n",expand(a,b));
 
 system("pause");

 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值