2014年05月16日

practice 3-3: Write a function expand(s1,s2) which expand the shorthand notation like a-z among the input string s1 into a complete list form a to z like abc...xyz.Allow for letters of either case and digits,and be  prepared to handle  cases like a-b-c,a-z0-9,-a-z .Arrange that  a leading and trailing - will be taken literally.

#include
#define MAXLINE 1000
void expand(char s1[],char s2[])
{
 int i,j=0;
 //char c;
 for(i=0;s1[i]!='\0';)
 
  if((s1[i]>='a'&&s1[i]<='z')&&(s1[i+1]=='-')&&(s1[i+2]>='a'&&s1[i+2]<='z'))
  {
   s2[j]=s1[i];
   while(s2[j]<=s1[i+2])
   {
    s2[j+1]=s2[j]+1;
    ++j;
   }
   i=i+2;
  }
  else if((s1[i]>='A'&&s1[i]<='Z')&&(s1[i+1]=='-')&&(s1[i+2]>='A'&&s1[i+2]<='Z'))
  {
   s2[j]=s1[i];
   while(s2[j]<=s1[i+2])
   {
    s2[j+1]=s2[j]+1;
    ++j;
   }
   i=i+2;
  }
  else if((s1[i]>='0'&&s1[i]<='9')&&(s1[i+1]=='-')&&(s1[i+2]>='0'&&s1[i+2]<='9'))
  {
   s2[j]=s1[i];
   while(s2[j]<=s1[i+2])
   {
    s2[j+1]=s2[j]+'1'-'0';
    ++j;
   }
   i=i+2;
  }
  else
   s2[j]=s1[i];
   ++i;
 }
   
 
  s2[j]='\0';
    
  
}
main()
{
 char str1[MAXLINE]="a-cA-C0-9",str2[MAXLINE];
 

 printf("orignal string:\n%s\n",str1);

 expand(str1,str2);

 printf("expand string:\n%s\n",str2);

 return 0;
}

 

CONCLUSION:This time i failed, half work is done,it could handle like a-z,a-z0-9 except like -a-z,a-c-z and so on,so i put the right answer here for reference.

#include
#include

void expand(char * s1, char * s2);

int main(void) {
    char *s[] = { "a-z-", "z-a-", "-1-6-",
                  "a-ee-a", "a-R-L", "1-9-1",
                  "5-5", NULL };
    char result[100];
    int i = 0;
   
    while ( s[i] ) {
       
       
       
        expand(result, s[i]);
        printf("Unexpanded: %s\n", s[i]);
        printf("Expanded  : %s\n", result);
        ++i;
    }
   
    return 0;
}


void expand(char * s1, char * s2) {
    static char upper_alph[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    static char lower_alph[27] = "abcdefghijklmnopqrstuvwxyz";
    static char digits[11]     = "0123456789";
   
    char * start, * end, * p;
    int i = 0;
    int j = 0;
   
   
   
   
    while ( s2[i] ) {
        switch( s2[i] ) {
        case '-':
            if ( i == 0 || s2[i+1] == '\0' ) {
               
               
               
                s1[j++] = '-';
                ++i;
                break;
            }
            else {
               
                
               
                if ( (start = strchr(upper_alph, s2[i-1])) &&
                     (end   = strchr(upper_alph, s2[i+1])) )
                    ;
                else if ( (start = strchr(lower_alph, s2[i-1])) &&
                          (end   = strchr(lower_alph, s2[i+1])) )
                    ;
                else if ( (start = strchr(digits, s2[i-1])) &&
                          (end   = strchr(digits, s2[i+1])) )
                    ;
                else {
                   
                   
                   
                   // fprintf(stderr, "EX3_3: Mismatched operands '%c-%c'\n",
                     //       s2[i-1], s2[i+1]);
                    s1[j++] = s2[i-1];
                    s1[j++] = s2[i++];
                    break;
                }
               
               
               
               
                p = start;
                while ( p != end ) {
                    s1[j++] = *p;
                    if ( end > start )
                        ++p;
                    else
                        --p;
                }
                s1[j++] = *p;
                i += 2;
            }
            break;
           
        default:
            if ( s2[i+1] == '-' && s2[i+2] != '\0' ) {
               
               
               
                ++i;
            }
            else {
               
               
               
                s1[j++] = s2[i++];
            }
            break;
        }
    }
    s1[j] = s2[i];   
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值