阅读以下说明和C代码,填写程序中的空缺,将解答写入答题纸的对应栏内。 【说明】 函数strCompress(char *s)对小写英文字母串进行压缩,其基本思路是:如果串长小于3则不压缩,否则对连续出现的同一字符,用该字符及其个数来表示。例如,字符

admin2021-03-24  38

问题 阅读以下说明和C代码,填写程序中的空缺,将解答写入答题纸的对应栏内。
【说明】
    函数strCompress(char *s)对小写英文字母串进行压缩,其基本思路是:如果串长小于3则不压缩,否则对连续出现的同一字符,用该字符及其个数来表示。例如,字符串"abbbcdddddddeeed"压缩后表示为"ab3cd7e3d"。
    如图4.1所示,在计算连续出现的同一字符个数时,借助字符指针s和计数变量k表示串中的字符,当s所指字符与其后的第k个字符不同时,个重复字符串的压缩参数即可确定。
           
【C代码】
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    void strCompress(char );

    int main()
    {
        char test[]  =  "abbbcdddddddeeed";

        printf("%s\n",test);
      (1)  ;  //调用strCompress实现test中字符串的压缩
        printf("%s\n",test);

        return 0;
    }
    void strCompress(char  str)
    {
    int i;
        chat p,tstr[11];    //在tstr中以字符串方式表示同一字符连续出现的次数
        char s=str,buf;    //借助buf暂存压缩后的字符串

        if(strlen(str)<3)
            return;

        bur=(char )malloc(strlen(str)sizeof(char)+1);
        if(!buf)
            return;
        for(i=0;s;){
    int k=1;    //用k累计当前字符的连续出现次数
          buf[  (2)  ]= s;    //先将当前字符写入buf[]
          if(s[1] &&s==(s+1)){
               k++;
               while(  (3)  )k++;

               sprintf(tstr,"%d",k);  //将k的值转换为数字串暂存在tstr中

              //将暂存在tstr中的数字字符逐个写入buf[]
               p=tstr;
               while( p )
                  buf[i++]=  (4)  
               }
               s+=k;    //跳过连续出现的同一字符,使s指向下一个不同的字符
        }
      (5)  =’0’;    //设置字符串结尾
        strcpy(str,buf);    //将暂存在buf中的压缩字符串复制给原串

        free(buf);
    }

选项

答案(1)strCompress(test)或strCompress(&test[0])或等效形式 (2)i++ (3)*s==*(s+k)或s[0]==s[k]或*(s+k)&&*s==*(s+k)或s[k]&&s[0]==s[k]或等效形式 (4)*p++或等效形式 (5)buf[i]或buf[i++]或*(buf+i)或等效形式。

解析 本题考查C程序流程控制和字符串处理及指针的应用
    空(1)处实现对函数strCompress的调用,根据strCompress的声明和定义,要求实参提供字符存储的地址,main函数中的字符数组test保存了需要压缩的字符串,因此空(1)应填入“strCompress(test)”或其等效形式。
    在函数strCompress中,对需要压缩的字符串进行单向扫描,并将压缩结果暂存在buf[]中,最后再从buf复制回原字符串。
    *s表示待压缩字符串的当前字符,若*s(即s[0])是串的最后一个字符,则*(s+1)(即s[1])就是串结束标志字符‘\0’,将*s放入buf[]后,通过s+=k(k=1)使得s指向‘\0’从而结束for循环。若*s不是串的最后一个字符,则需要判断*s与*(s+1)是否相等,从而对连续出现的同一字符进行计数(k的值为次数)。结合遍历字符串中字符的for循环,可知空(2)处应填入“i++”,空(3)处应填入“*s==*(s+k)”或其等效形式。
    设置压缩结果时,先将k的值转换为数字串暂存在tstr中,然后将暂存在tstr中的数字字符逐个写入buf[],因此空(4)应填入“*p++”或其等效形式。由于每次在buf[]中写入字符时都对下标i进行了自增,for循环结束后,buf即表示压缩字符串最后一个字符之后的位置,因此空(5)处应填入“buff”或其等效形式。
转载请注明原文地址:https://kaotiyun.com/show/82jZ777K
0

最新回复(0)