每日一练算法题(顺序串的基本操作)
假定下面所有的串均为顺序串,参数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;
}
原文地址:https://blog.csdn.net/2301_79847249/article/details/143029054
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!