题目描写叙述:

请实现一个函数,将一个字符串中的空格替换成“%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;
}