描述
输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入
输入包括3行,
第1行是包含多个单词的字符串 s;
第2行是待替换的单词a(长度 <= 100);
第3行是a将被替换的单词b(长度 <= 100).
s, a, b 最前面和最后面都没有空格.
输出
输出只有 1 行,将s中所有单词a替换成b之后的字符串。
样例输入
You want someone to help you You I
样例输出
I want someone to help you
解题思路 :
1、首先需要4个数组,前两个:一个记录原句子,一个用于记录替换后的句子。后两个:a[ ]表示要被替换的单词,b[ ]是替换成的单词。
2、找到需要替换的单词第一个字母出现的位置,这里对于单词与要注意:(1)句子中什么情况下为一个单词。(2)需要替换的单词可能不止一个。
while (n<len1)//确定要替换单词的位置,len1代表原句子的长度
{
if(a[m]==str[n]&&(str[n-m-1]==' '||n-m==0))//n-m==0考虑第一个单词
{
m++;
n++;
if (m==strlen(a)&&(str[n]==' '||str[n]=='\0'))//str[n]=='\0'考虑是否是最后一个单词
{
index[h]=n-m;//index[]数组记录出现要替换单词的初始位置n-m
h++;
m=0; //记录完成后为下一个需要替换的单词做准备
}
}
}
如果不注意会出现如下几种状况:
(3)(1)没注意单词是怎么判断的(2)没有将index初始化为-1
3、进行单词替换 ,并且注意单词替换后空格保留
h=0;
while (i<len1)//替换单词
{
if(i!=index[h])//不用被替换的单词直接复制到result[]数组
{
result[k]=str[i];
k++;
i++;
}
else //到达需要替换的位置开始替换
{
for(j=0; j<strlen(b); j++,k++)
{
result[k]=b[j];
}
i+=strlen(a);
h++;//替换后index[]转移到下一个需要替换的位置
}
}
完整代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char str[150]= {0},result[150]= {0};//result记录替换后的句子
char a[150]= {0},b[150]= {0};//a表示要被替换的单词,b是替换成的单词
int i=0,j=0,k=0,m=0,h=0,n=0;
int len1=0;
int index[100]={0};
memset(index,-1,100);//将数组初始化为-1
gets(str);
scanf("%s",a);
scanf("%s",b);
//index=strstr(str,a)-strstr(str,str);
len1=strlen(str);
while (n<len1)//确定要替换单词的位置
{
if(a[m]==str[n]&&(str[n-m-1]==' '||n-m==0))
{
m++;
n++;
if (m==strlen(a)&&(str[n]==' '||str[n]=='\0'))
{
index[h]=n-m;//index[]数组记录出现要替换单词的初始位置
h++;
m=0;
}
}
else
{
n=n-m+1;
m=0;
}
}
h=0;
while (i<len1)//替换单词
{
if(i!=index[h])//不用被替换的单词直接复制到result[]数组
{
result[k]=str[i];
k++;
i++;
}
else //到达需要替换的位置开始替换
{
for(j=0; j<strlen(b); j++,k++)
{
result[k]=b[j];
}
i+=strlen(a);
h++;//替换后index[]转移到下一个需要替换的位置
}
}
for (i=0; i<strlen(result); i++)
{
printf("%c",result[i]);
}
return 0;
}