阅读以下说明和C函数,将解答填入答题纸的对应栏内。 【说明】 函数del_substr(S,T)的功能是从头至尾扫描字符串S,删除其中与字符串T相同的所有子串,其处理过程为:首先从串S的第一个字符开始查找子串T,若找到,则将后面的字符向前移动将子串T覆盖掉

admin2010-04-12  36

问题 阅读以下说明和C函数,将解答填入答题纸的对应栏内。
【说明】
函数del_substr(S,T)的功能是从头至尾扫描字符串S,删除其中与字符串T相同的所有子串,其处理过程为:首先从串S的第一个字符开始查找子串T,若找到,则将后面的字符向前移动将子串T覆盖掉,然后继续查找子串T,否则从串S的第二个字符开始查找,依此类推,重复该过程,直到串S的结尾为止。该函数中字符串的存储类型SString定义如下:
typedef struct{
char*ch;    /*串空间的首地址*/
int length;    /*串长*/
}SString;
【c函数】
void del_substr(SString*S,SString T)(
int i,j ;
if(S->length<1 II T.1ength<1 II S->length(T.length)
return;
i=0:    /*i为串S中字符的下标*/
for(;;)    {
J=0 ;    /*j为串T中字符的下标*/
while(ilength&&jif(s>ch==T.ch[j])  {
i++;J++;
)
else{
i=  (1)  ;j=0;    /*i值回退,为继续查找T做准备*/
)
)
if(  (2)  )(    /*在S中找到与T相同的子串*/
i=  (3 )  ;    /*计算S中子串T的起始下标*/
for(k=i+T.1ength;klength;k++)/*通过覆盖子串T进行删除*/
S->ch[  (4)  ]=S->ch[k];
S-)length=  (5;)  ;    /*更新S的长度*/
)
else break;    /*串S中不存在子串T*/
)
)

选项

答案(1)i-j+l (2)j==T.length (3)i-T.1ength (4)i++(5)S->length-T.length

解析 空(1)处主要实现的功能是当串s和串T中有字母不相同时,串s下标需要返回至上一次串s和串T字符不同的位置,为继续查找串T做准备,串s的下标i返回的位置是串T的下标走过的长度,所以空(1)处应填“i-j+1”。因为j表示串s与串T比较中串T的下标,如果j的值等于串T的长度,则表示串s中有与串T相同的子串,所以空(2)处应该填写j==T.length。因为串S和串T在比较时,若字符一样,i和j同时加1,所以,串S在子串T的起始下标,应该为s的当前下标i减去串T的长度,即i-T.length,所以空(3)处应填“i-T.length”。删除与串T相同的子串的方法是将后面的元素向前移动进行覆盖,应该从串s在子串T的起始下标i开始,将后面的元素依次向前移动,最终覆盖子串,所以空(4)处填i++。每当删除一个与串T相同的子串,串s的长度就减少  T.length,所以空(5)处填S->length-T.length。
转载请注明原文地址:https://jikaoti.com/ti/cXW7FFFM
0

最新回复(0)