【C语言】练习3-3

  •  题目来源:《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);
}

你可能感兴趣的:(C语言)