编程思路
该函数可以处理大小写字母和数字,并可以处理a-b-c、a-z0-9 与 -a-z等类似的情况。作为前导和尾随的-字符原样排印。
思路很明确,检测字符’-‘,如果字符’-‘前后均为字母,说明这段为速记,判断前后字母的大小关系,字母是否相等,根据不同情况进行s2数据的输入。未检测到字符’-‘时,将s1元素原样复制到s2的最后一位。
!要注意,s2内的字符串长度与s1是不一样的,可以定义一个变量记录s2待输入的元素序号,亦可以灵活运用string.h内的strlen语句,读取s2的末尾标号。
用于程序编写时使用了strlen(),数组s2输入expand前要进行初始化,char s2 = {};
#include<stdio.h>
#include<string.h>
#define MAXLEN 100
// 编写函数expand(s1, s2),将字符串s1中类似于a-z一类的速记符号在字符串s2中扩展为等价的完整列表abc...xyz。
//该函数可以处理大小写字母和数字,并可以处理a-b-c、a-z0-9 与 -a-z等类似的情况。作为前导和尾随的-字符原样排印。
void expand(char s1[],char s2[])
{
int i,j,k;
for(i=0;i<strlen(s1);++i)
{
if(s1[i]=='-')
{
if(i!=0 && s1[i-1]!='-' && s1[i+1]!='-')
{
if(s1[i-1] < s1[i+1])
{
j=strlen(s2);
s2[j++]=s1[i-1]+1;
for(k=1;k<(s1[i+1]-s1[i-1]-1);k++)
{
s2[j]=s2[j-1]+1;
j++;
}
}
else if(s1[i-1] > s1[i+1])
{
j=strlen(s2);
s2[j++]=s1[i-1]-1;
for(k=1;k<(s1[i-1]-s1[i+1]-1);k++)
{
s2[j]=s2[j-1]-1;
j++;
}
}
else
{
s2[strlen(s2)]=s1[i];
}
}
else
{
s2[strlen(s2)]=s1[i];
}
}
else
{
s2[strlen(s2)]=s1[i];
}
}
}
main()
{
char s1[MAXLEN]={},s2[MAXLEN]={};
int i=0,c;
while((c=getchar())!='\n')
{
s1[i++] = c;
}
s1[i]='\0';
expand(s1,s2);
printf("s1 is %s\ns2 is %s",s1,s2);
}
输出示例:
TEST1:
-a-z--a-c
s1 is -a-z--a-c
s2 is -abcdefghijklmnopqrstuvwxyz--abc
TEST2:
-a-c-c-a
s1 is -a-c-c-a
s2 is -abc-cba
TEST3:(’F‘ ascii = 65;’a‘ ascii =97)
--A-F-aa-z--0-5--TEST3
s1 is --A-F-aa-z--0-5--TEST3
s2 is --ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aabcdefghijklmnopqrstuvwxyz--012345--TEST3
书中的参考答案
/* expand: expand shorthand notation in s1 into string s2 */
void expand(char s1[], char s2[])
{
char c;
int i, j;
i = j = 0;
while((c = s1[i++]) != '\0') /* fetch a char from s1[] */
if(s1[i] == '-' && s1[i + 1] >= c)
{
i++;
while(c < s1[i]) /* expand shorthand */
s2[j++] = c++;
}
else
s2[j++] = c; /* copy the character */
s2[j] = '\0';
}
未实现对如 c-a 等输入的扩展,同时无法处理连续’-‘,如-a--c-a,运行结果如下:
本文代码运行结果
-a--c-a
s1 is -a--c-a
s2 is -a--cba
答案代码运行结果
-a--c-a
s1 is -a--c-a
s2 is -a-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc-a