替换字符串中的空格

题目描述:给定一个字符串,比如” I am a student."。将字符串中的空格替换为%20。那么替换后的字符串为“I%20am%20a%20student.”

思路:(1)从头到尾遍历整个字符串,碰到空格,就移动后面的字符串,每次需要向后移动2个字节。(移动非常耗时。)

    (2)遍历一遍数组,统计出来整个字符串中有多少个空格,然后可以确定替换之后的字符串的长度,替换空格,生成新的字符串。

思路(2)注意事项:替换空格,生成新的字符串的时候,需要使用2个指针P1,P2,从后向前开始替换。其中,P1指向源字符串的末尾,P2指向替换后的新字符串的末尾。然后依次向前移动指针,逐个把它指向的字符赋值到P2所指示的位置处,直到碰到空格为止。当碰到空格时,P1向前一位,P2依次向前填充0,2,%。迭代继续,直到完成。

之所以选择从后向前是因为:替换后的新字符串是在源字符串原来占有的内存空间上新生成的,只不过比之间的字符串后面多用了 2*空格数 个字节。

基于思路2,写如下代码:

#include <iostream>
#include <string>
#include <string.h>
using namespace std;

void ReplaceBlank(char str[], int length)//length为给定的最大长度限制
{
  int count=0;//统计空格数
  int i=0;
  int originalLength=0;
  while(str[i]!='\0')
  {
    originalLength++;
    if(str[i++]==' ')
     count++;
  }

  int newLength=originalLength+count*2;
  if(newLength>length)
  {
   cout<<"超出了最大长度限制!"<<endl;
   return;
  }
  int indexOfOriginal=originalLength;
  int indexofNew=newLength;
  while(indexOfOriginal>=0&&indexofNew>indexOfOriginal)
   //indexofNew>indexOfOriginal保证了indexofNew也是一直>=0的
  {
   if(str[indexOfOriginal]!=' ')
   {
    str[indexofNew]=str[indexOfOriginal];
    indexOfOriginal--;
    indexofNew--;
   }
   else
   {
    indexOfOriginal--;
    str[indexofNew--]='0';
    str[indexofNew--]='2';
    str[indexofNew--]='%';
   }
  }
  cout<<"替换后的字符串为:"<<endl;
   cout<<str<<endl;
}


int main()
{
    int length=100;
    char str[length];
    cout<<"您要替换的字符串为:"<<endl;
    cin.getline(str,length);
    ReplaceBlank(str,length);
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值