案例分析题

试题三
阅读下列说明和 C 函数, 填补 C 函数中的空缺, 将解答填入答案纸的对应栏目内。

【说明】
字符串是程序中常见的一种处理对象, 在字符串中进行子串的定位、 插入和删除是常见的运算。
设存储字符串时不设置结束标志, 而是另行说明串的长度, 因此串类型定义如下:
Typedef struct {
     Char*str / / 字符串存储空间的起始地址
     int lehgth / / 字符串长
     int capacity / / 存储空间的容量
}SString;
【函数 1 说明】
函数 indexStr(S, T, pos) 的功能是: 在 S 所表示的字符串中, 从下标 pos 开始查找T 所表示字符串首次出现的位置。 方法是: 第一趟从 S 中下标为 pos、 T 中下标伟 0 的字符开始, 从左往右逐个对于来比较 S 和 T 的字符, 直到遇到不同的字符或者到达 T 的末尾。 若到达 T 的末尾, 则本趟匹配的起始下标 pos 为 T 出现的位置, 结束查找; 若遇到了不同的字符, 则本趟匹配失效。下一趟从 S 中下标 pos+1 处的字符开始, 重复以上过程。
若在 S 中找到 T, 则返回其首次出现的位置, 否则返回-1。
例如, 若 S 中的字符串伟″ students ents″ , T 中的字符串伟″ ent″ , pos=0, 则 T 在S 中首次出现的位置为 4。
【C 函数 1】
int index Str(SString S , SString T, int pos)
{
    int i, j:
    i (S. length<1| | S. length     return-1;
for(i=pos, j=0; i     if (S. str[i]==T. str[j] ) {
        i++; j++;
    } else{
        i=(     ) ; j=0
    }
}
if (     ) return i -T. length;
    return-1;
}
【函数 2 说明】
函数 eraseS 位(S, T} 的功能是删除字符串 S 中所有与 T 相同的子串, 其处理过程为: 首先从字符串 S 的第一个字符(下标为 0) 开始查找子串 T, 若找到(得到子串 在 S中的起始位置), 则将串 S 中子串 T 之后的所有字符向前移动, 将子串 T 覆盖, 从而将 其删除, 然后重新开始查找下一个子串 T, 若找到就用后面的宇符序列进行覆盖, 重复上述过程, 直到将 S 中所有的子串 T 删除。
例如, 若字符串 S 为 “12ab345abab678”、 T 为“ab”。 第一次找到 "ab" 时(位置为(2), 将 "345abab678 "前移, S 中的串改为"12345abab678" , 第二次找到"ab"时(位置为 5) ; 将 ab678 前移, S 中的串改为 "12345ab678", 第三次找到"ab"时(位置 为 5) ;
将“678‘前移 , S 中的串改为 "12345678 "。
【C 函数 2】
Void eraseStr(SString*S, SStringT)
{
      int i;
      int pos;
      if (S->length<| | T. length<1| | S->length             return;
      Pos=0
      for(; ; ) {
            / / 调用 indexStr 在 S 所表示串的 pos 开始查找 T 的位置
            Pos=indexStr(     ) ;
      if(pos=-1) / / S 所表示串中不存在子串 T
               return;
      for(i=pos+T. length; ilength; i++) / / 通过覆盖来删除自串 T
               S->str[(     ) ] =S->str[i];
            S->length=(     ) ; / / 更新 S 所表示串的长度
     }
}

【正确答案】

(1) i+1
(2) j==T. length
(3) S, T, pos
(4) i-T. length
(5) S ->length -T. length

【答案解析】

函数 1 为字符串匹配, 算法为: 先判断字符串 S 和 T 的长度, 如果为空则不用循环, 另外,如果字符串 S 的长度<字符串 T 的长度, 那字符串 S 中也不能含有字符串 T, 也无需进行匹配。
那当上述情况都不存在时, 即需要进行循环。 即从 S 的第一个字符开始, 与 T 的第一个字符进行比较, 如果相等, 则 S 的第二个字符和 T 的第二字符进行比较, 再相等就再往后移动一位进行比较, 依次直到字符串 T 的结尾, 也就是说 j=T, . length。
当某一个字符与 T 的字符不相等时, 那么字符串 S 就往下移一位, 再次进行与 T 的第一个字符进行比较, 此时 j 恢复初始值, j=0。
函数 2 为字符串的删除运算。 首先, 要调用函数 indexStr, 需要三个参数, 字符串 S、 字符串 T 和 pos。然后删除的字符串的位置为删除初始点的位置到其位置点+字符串 T 的长度,并将后面的字符串前移。 而删除 T 字符串后, 字符串 S 的总长度变化, 需减去字符串 T 的长度。