1.替换空格%20
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。
1.1分析
将长度为1的空格替换为长度为3的“%20”,字符差的产度变长。如果允许我们开辟一个新的数组来存放替换空格后的字符串,那么这道题目就非常简 单。设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串上填入“%20”,否则就复制元字符串上的内容。但是如果面试官要求 在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,那么我们就得另想方法。
如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。
- 首先遍历原字符串,找出字符串的长度以及其中的空格数量,
- 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
- 设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。
- 如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值“02%”
- 直到point1==point2时表明字符串中的所有空格都已经替换完毕。
1.2代码实例
#include<iostream> #include<stdio.h> using namespace std; //length为字符串总容量 void replacespace(char string[], int length) { int blanknumber = 0; int i; for (i = 0; string[i] != '\0'; i++) { if (string[i] == ' ') { blanknumber++; } } int k = i + 2 * blanknumber; if (k > length) return; string[k]='\0';//此行必不可少 int point1 = i - 1, point2 = k-1; for (; point1 >= 0 && point2 > point1; point1--) { if (string[point1] == ' ') { string[point2--] = '0'; string[point2--] = '2'; string[point2--] = '%'; } else string[point2--] = string[point1]; } } int main() { char *string=new char[50]; while (gets(string)) { replacespace(string, 50); puts(string); } return 0; }
2.清除空格
题目:请实现一个函数,把字符串中的每个空格清除掉。例如输入“We are happy.”,则输出“Wearehappy.”。
2.1分析
这道题目是需要清楚空格,那么清除空格后所得到的字符串要比原先的字符串要短,这是我们从头到尾进行清楚空格的话就不会覆盖到空格后面的字符,所以我们可以从头开始清除。
- 设定两个指针p1和p2初始状态都指向字符串首字符。
- 如果p2指向的元素不为空格,那么将p2指向的内容赋值给p1,然后p1和p2指向下一个元素;如果p2指向的内容为空格,那么p2指向下一个元素。
- 直到p2指向字符串末尾的'\0'时清除空格结束。
#include<iostream> #include<stdlib.h> using namespace std; void ReplaceBlank(char *s) { //设置两个指针指向数组首元素 char *p1=s; char *p2=s; while('\0'!=*p1) { if(' '!=*p2)//如果p2指向不为空格,则将p2指向内容复制给p1指向 *p1++=*p2++; else//如果p2指向为空格,则p2指针向前移动一格。 p2++; } } void main() { char test[100]="we are happy."; cout<<test<<endl;//we are happy. ReplaceBlank(test); cout<<test<<endl;//we are happy. system("pause"); }