题目:编写一函数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!
一道C语言题目,我的解法
最新推荐文章于 2023-07-28 10:31:02 发布