C语言实现替换空格为%20

一 问题描述

实现函数,把字符串中的空格替换为"%20"
例如:把字符串"We are happy“中的空格全都替换为”%20",替换之后字符串就变为了"We%20are%20happy"

二 解题思路

① 利用两个数组实现

对该字符串进行遍历,一个字符一个字符往另外一个数组里面放,如果遇到空格就放入%20.

注意:

当放完所有的字符后,记得加上字符结束标志‘\0'

要写成if else的结构,否则会多放入一个‘ ’

缺点:另外开辟了一个一块空间,会造成空间的浪费

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
	char str[100] = "I LOVE STUDY!";
	char space[100] = { 0 };
	int len =(int)strlen(str);
	int i = 0;
	int j = 0;
	for (i = 0; str[i] != '\0'; i++)
	{
		if (str[i] != ' ')
		{
			space[j] = str[i];
			j++;
		}

		else
		{
			space[j++] = '%';
			space[j++] = '2';
			space[j++] = '0';
		}
	}
	space[j] = '\0';

	printf("%s", space);
	return 0;
}

② 从前往后移动数组

从前往后对数组进行遍历,如果碰到空格,之后的所有元素都往后移动两个单位。

注意:由于会往后移动数组,因此数组的长度一直在变化。所以每次循环都需要重新计算长度。

缺点:效率低。每次遇到一个空格都需要往后移动

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
	char str[100] = "I LOVE STUDY";
	int i = 0;
	
	int j = 0;
	for (i = 0; str[i] != '\0'; i++)
	{
		if (isspace(str[i]))
		{
			int len = strlen(str);
			for (; len > i; len--)
			{
				str[len + 2] = str[len];
			}	
			str[i] = '%';
			str[i + 1] = '2';
			str[i + 2] = '0';
		} 
	}

	printf("%s", str);
	return 0;
}

③ 首先记录空格的数量,然后利用一个指针扩大数组2*空格数,指向扩大后末尾的位置,另外一个指针指向字符串的末尾。从后往前放入。

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
	char str[100] = "WE ARE HAPPY!";

	int len =(int)strlen(str);
	int space = 0;
	int i = 0;
	char* end1 = str + len-1;
	

	for (i = 0; str[i]; i++)
	{
		if (isspace(str[i]))
		{
			space++;//算出有多少个空格
		}
	}

	char* end2 = str + len -1+space * 2;

	while (end1 != end2)
	{
		if (isspace(*end1))
		{
			*end2-- = '0';
			*end2-- = '2';
			*end2-- = '%';
			end1--;	
		  }

		else
		{
			*end2 = *end1;
			end2--;
			end1--;
		}
	}
	
	printf("%s", str);

	return 0;
}

三 比较推荐第三种

效率比较高,也没有造成空间浪费。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值