CSDN博客

img avalonBBS

练习3-3

发表于2004/9/16 0:21:00  931人阅读


#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

相关博文

我的热门文章

img
取 消
img