实现一个函数,替换字符串的空格。

剑指offer——实现一个函数,把字符串的每个空格替换成%20。如to be or not to be,输出to%20be%20or%20not%20to%20be。

方法1:定义一个指针p指向数组,数组内元素个数为len,直观扫描数组,没有遇到空格时p++,遇见空格时将空格置为'%',利用memmove函数将数组往后移动两个字节,移动后的两个字节分别存放‘2','0',同时p+=3,每扫描一次len--,直至最后一个元素。

#include
#include
#include
#include
char *Replace(char *a,int len)
{
	char *p = a;
	int count = 0;
	while (len--){
		if (*p == ' '){
			*p = '%';
			p++;
			memmove(p + 2, p, len);
			*(p++) = '2';
			*(p++) = '0';
		}
		else{
			p++;
		}
	}
	return a;
}
int main()
{
	char a[40] = "to be or not to be";
	Replace(a,strlen(a));
	printf("%s\n", a);
	system("pause");
	return 0;
}

方法2:先遍历一次字符串,统计出字符串中空格的总数,可以计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。我们从字符串的后面开始复制和替换。首先准备两个指针p1和p2,p1指向原始字符串的末尾,p2指向替换之后的字符串的末尾。接下来向前移动指针p1,逐个把它指向的字符复制到p2指向的位置,直到碰到p1指向字符串首。

#include
#include
#include
#include
char *Replace1(char *arr)
{
	assert(arr);
	char *p1 =arr;
	char *p2;
	int len = 0;//数组元素个数
	int count = 0;//空格个数
	while (*p1 != '\0'){
		len++;
		if (*p1 == ' '){
			count++;
		}
		p1++;
	}
	p2 =p1+2 * count;
	while (p1 != arr){
		if (*p1 == ' '){
				p1--;
				*(p2--) = '0';
				*(p2--) = '2';
				*(p2--) = '%';
		}
		else{
			*(p2--) = *(p1--);
		}
	}
	return arr;
}
void Replace2(char a[], int len){
	int index = 0;//下标
	int count = 0;//空格个数
	int end = 0;
	if (a == NULL || len < 0){
		return;
	}
	for (; index < len; index++){
		if (a[index] == ' '){
			count++;
		}
	}
	//while (len--){
	//	if (a[index] == ' '){
	//		count++;
	//	}
	//	index++;
	//}//index==18,len==0
	end = index + 2 * count;
      while ( index != 0){
		if (a[index] == ' '){
			index--;
			a[end--] = '0';
			a[end--] = '2';
			a[end--] = '%';			
		}
		else{
			a[end--] = a[index--];
		}
	}
		return;
}
int main()
{
	char a[40] = "to be or not to be";
	//Replace1(a);//指针解决
	Replace2(a,strlen(a));//数组下标解决
	printf("%s\n", a);
	system("pause");
	return 0;
}

Java版 

 

你可能感兴趣的:(C语言练习)