假定下面所有的串均为顺序串,参数ch、ch1和ch2均是字符型,编写算法依次实现下列操作。
① 将串r中所有值为ch1的字符换成ch2的字符。
② 将串r中所有字符按照相反的次序仍存放在r中。
③ 从串r中删除其值等于ch的所有字符。
④ 从串r1中第index个字符起求出首次与串r2相同的子串的起始位置。
输入格式:
第一行:r
第二行:r1
第三行:r2
第四行:ch ch1 ch2
第五行:index
输出格式:
第一行:操作①结果
第二行:操作②结果
第三行:操作③结果
第四行:操作④结果(不存在输出-1)
函数接口定义:
void StrReplaceCh(SString *S, char ch1, char ch2); /*字符替换函数*/
void StrRreverse(SString *S); /*串逆置函数*/
void StrDeleteCh(SString *S, char ch); /*在串S中删除值为ch的字符*/
int StrIndex(SString *S, int index, SString T); /*求串T在串S中的位置*/
顺序串类型定义如下:
#define MAXLEN 50 //字符串的最大长度
typedef struct{char ch[MAXLEN]; //下标从0开始存放int len;
}SString;
裁判测试程序样例:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>#define MAXLEN 50 //字符串的最大长度
typedef struct{char ch[MAXLEN];int len;
}SString;void StrReplaceCh(SString *S, char ch1, char ch2); /*字符替换函数*/
void StrRreverse(SString *S); /*串逆置函数*/
void StrDeleteCh(SString *S, char ch); /*在串S中删除值为ch的字符*/
int StrIndex(SString *S, int pos, SString T); /*求串T在串S中的位置*/void StrInit(SString *s){s->len=0;
}/*将字符串常量tval的值赋给串s */
void StrAssign(SString *s, char *r){ int i=0;while (r[i]!='\0'){s->ch[i]=r[i];i++;}s->len=i;
}void main()
{SString s, s1, s2;char r[50], r1[50], r2[50];char ch, ch1, ch2;int i, loc, index;gets(r); gets(r1); gets(r2);scanf("%c %c %c", &ch, &ch1, &ch2); StrAssign(&s, r);/*操作1:字符替换*/StrReplaceCh(&s, ch1, ch2);for(i=0;i<s.len;i++)printf("%c", s.ch[i]);printf("\n");/*操作2:串逆置*/StrRreverse(&s);for(i=0;i<s.len;i++)printf("%c", s.ch[i]);printf("\n");/*操作3:串删除*/StrDeleteCh(&s, ch);for(i=0;i<s.len;i++)printf("%c", s.ch[i]);printf("\n");/*操作4:串定位匹配*/StrAssign(&s1, r1); StrAssign(&s2, r2);scanf("%d", &index); loc=StrIndex(&s1, index, s2);printf("%d\n",loc);}/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
abcaabcaaabca
abcaabcaaabca
aabc
a b c
0
输出样例:
在这里给出相应的输出。例如:
accaaccaaacca
accaaaccaacca
cccccc
3
void StrReplaceCh(SString *S, char ch1, char ch2) {for (int i = 0; i < S->len; i++) {if (S->ch[i] == ch1) {S->ch[i] = ch2;}}
}
void StrRreverse(SString *S) {for (int i = 0; i < S->len / 2; i++) {char temp = S->ch[i];S->ch[i] = S->ch[S->len - 1 - i];S->ch[S->len - 1 - i] = temp;}
}
void StrDeleteCh(SString *S, char ch) {int j = 0;for (int i = 0; i < S->len; i++) {if (S->ch[i] != ch) {S->ch[j++] = S->ch[i];}}S->len = j;S->ch[j] = '\0';
}
int StrIndex(SString *S, int index, SString T) {if (index < 0 || index >= S->len) {return -1;}for (int i = index; i <= S->len - T.len; i++) {int j = 0;while (j < T.len && S->ch[i + j] == T.ch[j]) {j++;}if (j == T.len) {return i;}}return -1;
}