c语言将字符串中的空格替换成%20

题目:请实现一个函数,把字符串中的每个空格替换成"%20"。样例: “abc defgx yz” 转“abc%20defgx%20yz

第一次看到这道题目,我写了一个如下的错误代码,大家首先思考下哪里错了呢?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include<assert.h>
  char *replace(char *p)
{
	assert(p != NULL);
	char *s = p;
	while (*p)
	{
		if (*p == ' ')
			*p = "%20"; 
		p++;
 	}
	return s;
}
int main()
{
	char a[] = "abc defgx yz";
	replace(a);

	printf("%s", a);//结果为:abc躣efgx躽z

	return 0;
}

其实上面代码的简单思想就是通过指针,遍历这个字符数组,找到空格就把它替换为%20,一直找到字符串末尾\0的位置为止。但是对于这一题我忽略了一个重要的问题,就是我们找到空格把它替换为%20,空格是一个字符,%20是三个字符,把三个字符替换为一个字符,内存空间怎么塞得下,造成数组越界,也至于结果也是奇奇怪怪的。

一个数组不行麻烦,找到空格需要移动后面的元素,那我们定义两个数组即可

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void replace(char *arr1, char *arr2)
{
	while (*arr1)
	{
		if (*arr1 != ' ')
		{
			*arr2 = *arr1;
			arr2++;
		}
		else
		{
			strcpy(arr2, "%20");
			arr2 = arr2 + 3;
		}
		arr1++;
	}
	*arr2 = '\0';

}
int main()
{
	char arr1[] = "abc defgx yz";;//数组大小为13
	char arr2[40];//随意定义合适的数组大小,放的下arr1的内容即可
	replace(arr1, arr2);
	printf("%s", arr2);
	return 0;
}

程序运行结果:
在这里插入图片描述

上面代码的基本实现思路为:

  • 定义两个数组,arr1用来存原字符串,arr2用来存放添加了%20后的字符串
  • 通过指针遍历数组arr1,寻找空格,直到找到字符串的\0为止,如果在遍历过程中不是空格,一个字符一个字符的把arr1的内容放到arr2里面,如果遇到空格在放完不是空格的字符后面,把%20拷贝到放完后字符串的后面,arr2前面的空间已经占满,所以下一次放字符的位置要向后移动三个位置。以此规律继续执行下去。
  • 最后当找到arr1的\0替换完成,在arr2替换完的字符后面加上\0即可(因为arr2只定义没有初始化,里面没有内容)

还有另外一种算法也行,先看代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>

char * replace (char *str)
{
	char *p = str;
	char arr[30];
	while (*p != '\0')
	{
		if (*p == ' ')
		{
			strcpy(arr, p + 1);
			*p = '%';
			*(p + 1) = '2';
			*(p + 2) = '0';
			strcpy(p + 3, arr);
			p = p + 3;//有三个位置已经被占用了,p向后移动三个位置
			continue;//p已经移动过了,所以不要移动了,使用continue跳过后面的代码p++
		}
		p++;
	}
	return str;
}
int main()
{
	char arr1[30] = "abc defgx yz";//14
	//char arr2[40];
	replace(arr1);
	printf("%s", replace(arr1));
	return 0;
}

这种算法思想和上面的有点相似,上面那个代码是在第二个数组里面加了%20后,输出这个数组arr2,不使用原来的数组;下面的这种思想是借用一个数组临时存放东西,在添加了%20后,再把空格后面临时存放的东西,拿回原来的数组。

上面代码的基本思路是: 每次都需要把空格后的字符串保存到一个数组中,然后把空格替换为%20后再将刚刚拷贝的字符串拷贝到%20的后面即可。

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值