问答题 采用顺序存储方式存储串,编写一个置换函数,将串s1中的第i个字符开始的j个字符(包括第i个字符)构成的子串用s2串进行替换,函数名为replace(s1,i,j,s2)。例如:replace("abcd",1,3,"xyz")返回"xyzd"。
【正确答案】本题比较简单,有多种处理方法: 思路1:先给替换串腾出足够的位置,比如从i到j有n个字符,s2的长度为m,如果m<n,则下标j+1往后的字串向前移动n-m个位置;如果m>n,则下标j+1往后的字串向后移动m-n个位置;如果m等于n,则无需移动。然后将s2串复制到腾出的位置上。 思路2:先提取s1中位置i之前的所有字符构成的子串str1,再提取位置i+j-1及之后的所有字符构成的子串str2,最后将str1、s2、str2连接起来便构成了结果串。 本题代码如下(仅提供“思路2”的实现): Str replace(Str *s1,int i,int j,Str *s2) { Str s; int n,k; if(i+j-1<=s1->length) { for(n=0;n<i-1;++n) //把s1的前i-1个字符赋给s s.ch[n]=s1->ch[n]; for(n=0;n<s2->length;++n) //连接s2串 s.ch[i+n-1]=s2->ch[n]; s.length=i+s2->length-1; for(n=s.length,k=i+j-1;k<s1->length;++n,++k) //连接s1的位置i及之后的字符 s.ch[n]=s1->ch[k]; s.length=n; s.ch[s.length]='/0'; } else { s.ch[0]='/0'; s.length=0; } return s; }
【答案解析】