本题最大的困难是如何在不新建新的数组下完成空格替换,主要考察数组指针的运用
思路:(1)找出字符串空格的长度,从而确定新的子串尾指针的位置所在;
(2)通过遍历找出空格,string[indexOfNew--]依次附上%20三个字符,indexOfOriginal--
注:并没有通过实际指针而是通过字符串下标操作,起始时均指向末尾位置
#include <stdio.h> #include <stdlib.h> #include <string.h> /* *Author xsf *剑指offer,替换空格 */ //求出传入数组的空格长度 int GetBankLen(char str[]) { ; char *p = str; while(*p!='\0') { if(*p==' ') BankNum++; p++; } return BankNum; } /*置换空格的函数 length是字符数组string的总容量 */ void ReplaceBlank(char string[],int length) { )//安全性判断 return; int BankNum = GetBankLen(string);//获取输入string的空格数目 ; //移动数组后的总长度 // char *str1 = string+length-1;//第一个指针指向数组的最后\0位置 // if(*str1 =='\0') // printf("指向了最后的\0"); // char *str2 = string+newLength-1;//第二个指针指向替换后的最后\0位置 /*移动指针*/ int indexOfOriginal = length; int indexOfNew = newLength; &&indexOfNew>indexOfOriginal) { if(string[indexOfOriginal]==' ')//当遇到空格,则在新的加上%20 { // printf("遇到空格/n"); '; '; string[indexOfNew--] = '%'; } else { string[indexOfNew--] = string[indexOfOriginal]; } indexOfOriginal--; } } int main(int argc,char *argv[]) { char string[] = "X S F"; int Totallen = sizeof(string)/sizeof(char);//包含/0 // int Strlen = strlen(string);//不包含/0 printf("替换前%s\n",string); ReplaceBlank(string,Totallen); printf("替换后%s\n",string); // printf("len=%d\n",Totallen); // printf("str=%d\n",Strlen); // int BankNum = GetBankLen(string); // printf("空格长度为%d\n",BankNum); }