替换字符串中的空格

题目描述:

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

输入:

每个输入文件仅包含一组测试样例。
对于每组测试案例,输入一行代表要处理的字符串。

输出:

对应每个测试案例,出经过处理后的字符串。

样例输入:
We Are Happy
样例输出:
We%20Are%20Happy

--------------------------------------------------------------------------

先来一个最初ac的搞笑版的代码:

#include<stdio.h>
#include<stdlib.h>
 
int main()
{
    char str[1000000];
    gets(str);
    char *p = str;
    while(*p != '\0')
    {
        if(*p == ' ')
        {
            printf("%s","%20");
         
        }else
        {
            printf("%c",*p);
         
        }
        p++;
    }
    printf("\n");
    return 0;
}
/**************************************************************
    Problem: 1510
    User: Rowandjj
    Language: C++
    Result: Accepted
    Time:30 ms
    Memory:1928 kb
****************************************************************/

当然,这不是本题本意,哈哈。。

思路应该是这样的:

1.首先遍历一遍该字符串,计算字符串长度len、字符串中空格个数num。新串的长度应该为len+num*2.
2.建立两个指针分别指向原始串与替换后的串尾位置。 从后向前复制,遇到空格就替换成%20.
代码:

/*********************************
替换空格
by Rowandjj
2014/7/16
*********************************/
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAX 1000000
//替换空格(在原始串的基础上)
void ReplaceBlank(char string[],int len)//len为字符数组总长度
{
	if(string == NULL || len <= 0)
	{
		return;
	}
	int i = 0;
	int o_len = 0;//原始串有效字符长度
	int b_len = 0;//空格个数
	while(string[i] != '\0')
	{
		o_len++;
		if(string[i] == ' ')
		{
			b_len++;
		}
		i++;//别忘了i自增,否则永远出不来
	}
	int n_len = o_len + b_len*2;//替换后的串的长度
	if(n_len > len)//新串长度大于字符数组总长度
	{
		return;
	}
	
	int n_index = n_len;//指向新串的指针,开始时指向串尾
	int o_index = o_len;//指向原始串的指针
	
	while(o_index >= 0 && n_index>o_index)//采用从后向前复制替换,好处是减少字符的移动次数
	{
		if(string[o_index] == ' ')//指向空格时
		{
			string[n_index--] = '0';
			string[n_index--] = '2';
			string[n_index--] = '%';
		}else
		{
			string[n_index--] = string[o_index];
		}
		o_index--;
	}
}
int main()
{
	char str[MAX];
	char *p = str;
	gets(p);
	ReplaceBlank(str,MAX);
	cout<<p<<endl;
	return 0;
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值