试题三
阅读下列说明和 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
for(i=pos, j=0; i
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
Pos=0
for(; ; ) {
/ / 调用 indexStr 在 S 所表示串的 pos 开始查找 T 的位置
Pos=indexStr( ) ;
if(pos=-1) / / S 所表示串中不存在子串 T
return;
for(i=pos+T. length; i
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 的长度。