在目标串T[0,n-1]=”xwxxyxy”中,对模式串p[0,m-1]=”xy”进行子串定位操作的结果_______
A.0
B.2
C.3
D.5
●试题五
阅读以下程序说明和C程序,将应填入(n)处的子句,写在答卷纸的对应栏内。
【程序说明】
函数int commstr(char *str1,char *str2,int *sublen)从两已知字符串str1和str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出并输出。约定空串不作为公共子串。
函数将最长公共子串的长度送入由参数sublen所指的变量中,并返回字符串str1和str2的最长公共子串的个数。如果字符串str1和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。
【程序】
int strlen(char *s)
{char *t=s;
while(*++);
return t-s-1;
}
intcommstr(char)*str1,char *str2,int *sublen
{char*s1,*s2;
int count=0,len1,len2,k,j,i,p;
len1=strlen(str1);
len2=strlen(str2);
if(len1>len2)
{s1=str1;s2=str2;}
else{len2=len1;s1=str2;s2=str1;}
for(j=len2;j>0;j--)/*从可能最长子串开始寻找*
{for(k=0; (1) <=len2;k++)/*k为子串s2的开始位置*/
{for(i=0;s1[ (2) ]!='\0';i++;)/* i为子串s1的开始位置*/
{/* s1的子串与s2的子串比较*/
for(p=0;p<j)&& (3) ;p++);
if ((4) )/*如果两子串相同*/
{for(p=0);p<j;p++}/*输出子串*/
printf("%c",s2[k+p]);
printf("\n");
count++;/* 计数增1*/
}
}
}
if (count>0)break;
*sublen=(count>0)? (5) :0;
return count;
}
阅读以下程序说明和C程序,将应填入(n)处的子句,写在对应栏内。
【程序说明】
函数int commstr(char * str1,char * str2,int * sublen)从两已知字符串str1和str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出并输出。约定空串不作为公共子串。
函数将最长公共子串的长度送入由参数sublen所指的变量中,并返回字符串str1和str2的最长公共子串的个数。如果字符串str1和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。
【程序】
int strlen(char * s)
{char *t=s;
while(* ++);
return t-s-1;
}
int commstr(char) *str1,char *str2,int *sublen
{ char*s1, *s2;
int count=0,len1 ,len2,k,j,i,p;
len1:=strlen(str1)
len2 = strlen(str2);
if(len1>len2)
{s1=str1 ;s2=str2;}
else {len2 = len1;s1 = str2;s2 = str1;}
for(j=len2;j>0;j--) /*从可能最长子串开始寻找*/
{for(k=0;(1)<:len2;k++) /*k为子串s2的开始位置*/
{for(i=0;s1[(2)]!='\0';i++;) /*i为子串s1的开始位置*/
{ /*s1的子串与s2的子串比较*/
for (p=0;p<j)&&(3);p++);
if ((4)) /*如果两子串相同*/
{for(p=0);p<j;p++} /*输出子串*/
printf ("%c",s2[k+p]);
printf ("\n");
count++;/*计数增1 */
}
}
}
if (count>0) break;
*sublen=(count>0)?(5):0;
return count;
}
试题四(共 15分)
阅读以下说明和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 || T.length < 1 || S->length < T.length )
return;
i = 0; /* i为串S中字符的下标 */
for (; ; ) {
j = 0; /* j为串T中字符的下标 */
while (i < S->length && j < T.length ) { /* 在串S中查找与T相同的子串 */
if (S->ch[i]==T.ch[j] ) {
i++; j++;
}
else {
i = (1) ; j = 0; /* i值回退,为继续查找T做准备 */
}
}
if ((2) ) { /* 在S中找到与T相同的子串 */
i = (3) ; /* 计算S中子串T的起始下标 */
for(k = i+T.length; k<S->length; k++) /* 通过覆盖子串T进行删除 */
S->ch[ (4) ] = S->ch[k];
S->length = (5) ; /* 更新S的长度 */
}
else break; /* 串S中不存在子串T*/
}
}
为了保护您的账号安全,请在“简答题”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!