一道C语言题目,我的解法

题目:编写一函数expand(s1,s2),用以将字符串s1中的缩记符号在字符串s2中扩展为等价的完整字符,例如将 a-d扩展为abcd。该函数可以处理大小写字母和数字,并可以处理a-b-c、a-z0-9与-a-z等类似的情况。在main函数中测试该函数:从键 盘输入包含缩记符号的字符串,然后调用该函数进行扩展,输出扩展结果。
(教材 P63:Exercise 3-3)
【输入形式】
从 键盘输入包含扩展符的字符串
【输出形式】
输出扩展后的字符串
【输入样例】
a-c-u-B
【输出样例】
abcdefghijklmnopqrstu-B
【样 例说明】
扩展输入a-c-u为:abcdefghijklmnopqrstu,而B比u值小,所以无法扩展,直接输出。


我 的算法思路如下:
1、通过输入来获取待扩展字符
2、用三个char变量来存储连续的三个字符
3、对三个char变量进行分析,然 后输出

代码如下:
#include <stdio.h>    //标准输入输出库
#include <string.h>    //用到保存字符串的函数gets(char *)
#include <ctype.h>    //基本类型判断头文件

#define N 10    //限制带扩展字符的宽度

int print1(char,char,char);    //带返回的打印,用返回数字来判断移进的字符数
void print2(char,char,char);    //根据最后三个带扩展字符来打印

void main()
{
    int i,j;    // i 存储输入的带扩展字符的个数,j作为循环不变量
    char first,second,third;    //存储连续的三个字符
    char s[N];   //存储所有待扩展字符的数组

    gets(s);    //存储所有待扩展字符
    i=0;
    while(s[i]!='\0')
        i++;

    if(i<3)
        printf("%s",s);    //若总待扩展字符数小于3,则直接输出之
    else
    {
        for(j=0;j<i-3;)    //否则,先判断前面i-3个字符
        {
            first=s[j];
            second=s[j+1];
            third=s[j+2];
            if(print1(first,second,third))
                j=j+2;    //若能扩展,则移进两个字符
            else
                j++;    //若不能扩展,则只移进一个字符
        }
        print2(s[i-3],s[i-2],s[i-1]);    //判断最后三个字符并打印之
    }
}

int print1(char first,char second,char third)
{
    char i;

    //若第二个字符为'-',并且第一个字符和第三个字符同型,并且第一个字符小于第三个字符,则输出
    if(second=='-'&&(isdigit(first)&&isdigit(third)||isalpha(first)&&isalpha(third))&&first<third)
    {
        for(i=first;i<third;i++)
            printf("%c",i);
        return 1;
    }
   
    //否则,只输出第一个字符
    printf("%c",first);
    return 0;
}

void print2(char first,char second,char third)
{
    char i;

    //若第二个字符为'-',并且第一个字符和第三个字符同型,并且第一个字符小于第三个字符,则输出
    if(second=='-'&&(isdigit(first)&&isdigit(third)||isalpha(first)&&isalpha(third))&&first<third)
    {
        for(i=first;i<=third;i++)
            printf("%c",i);
    }
    else
        printf("%c%c%c",first,second,third);    //直接打印最后三个不能扩展的字符
}


简 单的编写几个测试用例,发现均能通过测试,ok!Let's go to the next one!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值