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