题目:输入一个字符串,要求将这个字符串中所有空格的位置都替换成”%20“.例:输入I love you. 输出I%20love%20you.
分析:空格是一个字符,%20是三个字符,所以替换的时候要向后挪动。
这里有三种方法。
第一种:从前向后遍历字符串,遇到一个空格,则将这个空格之后的字符‘\0‘开始依次向后挪动两个字符,然后再放入%20,直到遍历完整个字符串。这种方法效率比较低。
第二种:重新创建一个字符数组,将这个字符串拷贝过来,遇到空格就替换成%20. 这种方法虽然效率高,但是空间复杂度却增高了。
第三种:先统计整个字符串中空格的数量。再‘\0‘开始向后一次挪动2*空格数,遇到一次空格,则空格数减一,并且将%20放入。直到空格数为0. 这种方法时间和空间相对来说都是最理想的。
在这里我们只实现第三种:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h> char *replace_blank(char src[]) { assert(src ); int blank = 0; char *psrc = src ; while (*psrc) //统计空格个数,同时让psrc指向‘\0' { if (*psrc == ' ' ) blank++; psrc++; } while (blank) { if (*psrc== ' ' ) //遇到空格开始替换 { *(psrc+blank*2)= '0'; *(psrc+blank*2-1)= '2'; *(psrc+(--blank)*2)= '%'; } else *(psrc+blank*2)= *psrc; psrc--; } return src ; } int main() { char src[50] = { 0 }; gets(src); char *ret = replace_blank(src); printf( "%s\n", ret); system( "pause"); return 0; }
时间: 2024-10-11 17:22:00