- 题目来源:《The C programming language》中的习题P49
- 练习2-9: 编写函数expand(s1, s2),将字符串s1中类似于a-z一类的速记符号在字符串s2中扩展为等价的完整列表abc...xyz。该函数可以处理大小写字幕和数字,并可以处理a-b-c、a-z0-9与-a-z等类似的情况。作为前道和尾随的-字符原样打印。
- 代码实现:
#include<stdio.h>
#include<string.h>
#define MAX 1000
//判断是否为字母或者数字
int chargeCon(char c1){
if((c1 >= '0' && c1 < '9') || (c1 >= 'a' && c1 <= 'z') || (c1 >= 'A') && c1 <= 'Z'){
return 1;
}else{
return 0;
}
}
// 字符扩展
int expandToFull(char c1, char c2, char* s,int pos){
int i;
if(c1 < c2){
i = c1 + 1;
for(; i< c2 + 0; i++){
s[pos++] = i;
}
}else{
i = c1 - 1;
for(; i > c2 + 0; i--){
s[pos++] = i;
}
}
return pos;
}
// 扩展,即将a-z扩展为abcd..xyz
void expand(char* s1, char* s2){
int i, j, flag1, flag2;
s2[0] = s1[0];
j = 1;
for(i = 1; i < strlen(s1); i++){
flag1 = chargeCon(s1[i-1]);
flag2 = chargeCon(s1[i+1]);
// 如果是速记符号
if( flag1 == 1 && flag2 == 1 && s1[i]=='-'){
j = expandToFull(s1[i-1], s1[i+1], s2, j);
}else{
s2[j++] = s1[i];
}
}
s2[j]='\0';
}
//主函数
void main(){
char charArr1[] = "-a-c-e-addd 1-3-1";
char charArr2[MAX];
expand(charArr1,charArr2);
printf("%s\n",charArr2);
}