NOI1.7.21:单词替换

描述

输入一个字符串,以回车结束(字符串长度<=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;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值