C语言实现替换空格为%20(剑指offer)

您所在的位置:网站首页 将空格替换成底纹为蓝色怎么弄的 C语言实现替换空格为%20(剑指offer)

C语言实现替换空格为%20(剑指offer)

2024-01-20 20:32| 来源: 网络整理| 查看: 265

项目场景:

在网络编程中,如果URL中有含有特殊字符,如空格、’#'等,可能就会导致服务器无法获得正确的参数值,所以需要我们把这些特殊字符进行替换,替换为服务器可以进行识别的字符

问题描述:

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

问题分析:

替换空格,我们需要做的是判断是否为空格,若果是,那么后面的字符统一后移两位(因为%占了空格的位子,所以移动两位),我们需要考虑数组长度大小,还有如何移动并判断字符字符。

这里我给出三种方法:

解决方案:

方法1:

从头往后找,如果遇到空格,则将后面所有的字符往后移两个字符,然后添加%20,我们只需要一个字符数组即可,但是效率低时间复杂度为O(n^2),空间复杂度为O(1);

代码如下:

void ReplaceBlank1(char str[]) { int j; for (int i = 0; str[i] != '\0';) { if (str[i] == ' ') { j = strlen(str);//从后往前,将每个字符往后移2位 for(;j>i;j--) { str[j + 2] = str[j]; } str[i++] = '%'; str[i++] = '2'; str[i++] = '0'; } else i++; } } int main() { char str[100] ; printf("请输入字符串:"); fgets(str, 100, stdin); ReplaceBlank1(str); printf("替换后为:%s",str); return 0; }

方法2:

额外定义一个数组用于存放替换后的字符串,此方法时间复杂度为O(n),但因为需要重新定义一个内存大小相同的字符数组,因此空间复杂度为O(n)。

 代码如下:

void ReplaceBlank2(char str1[]) { int i;//str1下标 int j=0;//str2下标 char str2[100]; for (i = 0; str1[i] != '\0'; i++) { if (str1[i] != ' ') { str2[j++] = str1[i]; } else//空格 { str2[j++] = '%'; str2[j ++] = '2'; str2[j ++] = '0'; } } str2[j] = '\0'; strcpy(str1, str2);//将替换后的字符串复制到str中 } int main() { char str[100] ; printf("请输入字符串:"); fgets(str, 100, stdin); ReplaceBlank2(str); printf("替换后为:%s", str); return 0; }

方法3:

先计算空格数,然后直接从后往前进行字符处理。此方法相比于上两个在时间空间度上都有节省,时间复杂度O(n),空间复杂度O(1)。

代码如下: 

void ReplaceBlank3(char brr[]) { int count = 0;//记录空格数 int i; for (i = 0; brr[i] != '\0'; i++)//统计空格的数量 { if (brr[i] == ' ') count++; //i此时已经走到最后一个字符 } int j = i + 2 * count;//当前可以存放移动后的字符下标 for (; i >= 0; i--) { if (brr[i] != ' ')//直接后移 { brr[j--] = brr[i]; } else//空间 { brr[j--] = '0'; brr[j--] = '2'; brr[j--] = '%'; } } } int main() { char str[100] ; printf("请输入字符串:"); fgets(str, 100, stdin); ReplaceBlank3(str); printf("替换后为:%s", str); return 0; }

程序演示:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3