阅读下列算法说明和算法,将应填入(n)处的语句写在对应栏内。 【说明】 本程序可以将字符串s1中出现的所有s2子串替换成s3,形成一个新串,但不破坏字符串s1。 【代码】 #include<stdio.h> #include

admin2010-01-15  62

问题 阅读下列算法说明和算法,将应填入(n)处的语句写在对应栏内。
    【说明】
   本程序可以将字符串s1中出现的所有s2子串替换成s3,形成一个新串,但不破坏字符串s1。
   【代码】
   #include<stdio.h>
   #include<stdlib.h>
   #include<string.h>
   char*replace(char *s1, char *s2,char *s3)
   {    char *p, *q, *r, *s; int   |2,|3, i=0;
        |2=strlen(s2);
        |3=strlen(s3);
        p=s1;
        while((p=strstr(p,s2))!=NULL)
        {    i++;    /*  统计s2串出现的次数*/
               (1);
        }
        i=(2);
        s=r=(char*)malloc(i);    /*分配动态内存存放新字符串*/
        p=s1;
        while(1)
        {    q=strstr(p, s2);    /* s2串是否在s1中出现,q是首次出现的位置*/
             if(q!=NULL)
             {    i=q-p;
                   (3);
                  r+=i;
                   (4);
                  r+=|3;
                  p=q+|2;      /*将指向s1串的指针移到s2子串出现的位置后,
                                   为下一次循环做好准备*/
             }
             else         /*q为空,表示剩余的s1串中已经没有s2*/
             {      (5);
                   break;         /*终止循环*/
             }
        }
        return(s);        /*返回指向所形成的新串的指针*/
   }
   void main()
   {    char *a="sabcababde", *b="ab", *c="efg", *d;
        d=replace(a, b, c); printf("result=%s\n", d); free(d);
   }

选项

答案(1)p+=12 (2)strlen(s1)-i*12+i*13+1 (3)strncpy(r,p,i) (4)strcpy(r,s3) (5)strcpy(r,p)

解析 本题考查用C语言实现对字符串的操作。
   题目要求将字符串s1中出现的所有子串s2替换成s3,形成一个新串,但不破坏字符串s1。要不破坏字符串s1,只有用一个新串来存放处理结果;要用到新串,那么就需要重新分配空间。
   第(1)空在第一个循环体中,此循环体的作用在注释中已经给出,用来统计串s2在串s1中出现的次数,这里的统计变量已经给出,并将结果存放在统计变量i中,但每次统计成功后串s1的位置应该往后移动串s2的长度,由程序我们可以看出,串s1存放在指针变量p中,因此,指针变量p指的位置需要往后移动串s2的长度,而串s2的长度存放在变量12中。因此,此空答案为p+=12。
   第(2)空很明显是用来给变量i赋一个值,但根据s=r=(char*)malloc(i)语句我们可以推断出,当前变量i中存放的是新串的长度。而新串的长度应该等于串s1的长度减去串中x个串s2的长度,加上x个串s3的长度再加1,而在上面的循环中已经求出了串s2在串s1中出现的次数,结果存放在变量i中。因此,此空答案为strlen(sl)-i*12+i*13+1。
   第(3)空是在if(q !=NULL)成立的情况下运行的语句,而变量q指向的是s2在s1中首次出现的位置,如果条件成立,说明串s2在串s1中出现了,语句i=q-p用来表示出现的位置到s1开始位置的距离。在这些条件都清楚了后,应该往新的串中写字符了,首先写串s1的前i个字符,此空就是用来完成这个功能的,因此,此空答案为strncpy(r,p,i)。
   第(4)空是接着上一空而来的,在上面我们[分析]到,把串s1的前i个字符写入新串,那么在新串中接着要出现的应该是替换串s2的串s3,此空的任务应该是将串s3写入新串中,因此,此空答案为strcpy(r,s3)。
   第(5)空是在if(q !=NULL)不成立的情况下运行的语句,这说明串s2不在串s1中出现,在这种情况下,串应该不需要进行替换操作,而直接将串s1写入到新串中,此空的作用就是用来实现这个功能的,因此,此空答案为strcpy(r,p)。
转载请注明原文地址:https://kaotiyun.com/show/wIjZ777K
0

最新回复(0)