【问题描述】编写一个程序,把一个字符串中出现的对应子串都删除。建议使用字符串的定长存储方式(静态存储)。
#define MAXSTRLEN 255
typedef char SString[MAXSTRLEN+1];
【输入形式】用户在第一行输入一个字符串,用户在第二行输入一个子串。
【输出形式】程序在下一行输出删除其中所有子串后的字符串。如果字符串不包含子串则输出原字符串本身。
【样例输入】
I am a boy!
a
【样例输出】
I m boy!
【样例说明】用户首先输入字符串I am a boy!,然后输入子串a,程序会寻找字符串中的子串删除它,最后将删除后的结果输出:I m boy!
【运行结果如下】
【代码如下】
#include<stdio.h>
#define ERROR -1
#define OK 1
#define MAXSTRLEN 255 //用户可在255以内定义最长串长
typedef char SString[MAXSTRLEN+1]; //0号单元存放串的长度
typedef int Status;
/*赋值*/
Status StrAssign(SString &S)
{
int i = 0;
int k = 0;
int len = 0;
char ch[254];
gets(ch);
while (ch[i++] != '\0') len++; //获取ch的长度
i = 1;
if (len > MAXSTRLEN)
return ERROR; //串长度大于给定长度,发生截断
else
while (i <= len) S[i++] = ch[k++];
S[0] = len;
return OK;
}
/*获取子串*/
Status SubString(SString &Sub,SString &S,int pos,int len)
{
int i = 1;
if ((pos<1) || (pos>S[0]) || (len<0) || len>(S[0]-pos+1))
return ERROR;
while (i <= len){
Sub[i] = S[pos+i-1];
i++;
}//while
Sub[0] = len;
return OK;
}
/*串比较*/
bool StrCompare(SString &S,SString &T)
{
int i = 1;
int j = 1;
while (i<=S[0] && j<=T[0]){
if (S[i++] != T[j++])
return false;
}//while
return true; //相等
}
/*输出串*/
Status outputStr(SString &S)
{
int i;
for(i=1; i<=S[0]; i++)
printf("%c",S[i]);
return OK;
}
/*删除*/
Status delString(SString &S,SString &T)
{
SString Sub;
int i = 1;
int j;
while (i <= S[0]-T[0]+1){
SubString(Sub,S,i,T[0]); //从S的第i个位置获取一个T[0]长度的子串
if (!StrCompare(Sub,T))
i++;
else{
for(j=i; j <= S[0]-T[0]; j++){
S[j] = S[j+T[0]];
}
S[0] = S[0] - T[0];
}
}//while
return OK;
}
int main()
{
SString S,T;
StrAssign(S);
StrAssign(T);
delString(S,T);
outputStr(S);
return 0;
}
本文章仅供学习和参考!
欢迎交流~