#include<stdio.h>
/*
将字符串中的空格替换成%20
*/
void replaceBlank(char *str,int length){
int i=0,count=0,j=0;
while(str[i]!='\0'){
if(str[i] == ' ')
count++;
i++;
}
j=i+count*2;
str[j--] = '\0';
i--;
while(i>=0&&j>0){
if(str[i]!=' ')
str[j--] = str[i];
else{
str[j--]='0';
str[j--]='2';
str[j--]='%';
}
i--;
}
}
int main(){
char s[] = "hello world! ";
printf("%s\n",s);
replaceBlank(s,13);
printf("?%s? ",s);
return 1;
}
拓展:合并有序数组
#include<stdio.h>
/*
本例子是替换空格的拓展。共同点都是从数组的尾部开始,因为有序,所以这样减少比较和复制的次数
有两个排序的数组A1和A2.其中A1有足够多的空间容纳A2,要求融合后的数组仍然是有序的
*/
void print(int arr[],int len);
void combine2Array(int *a,int *b,int alen,int blen){
int i=alen-1,j=blen-1,len;
//因为数组不是字符串数组,没有'\0'作为结尾的标志位。故必须在传参数时传进来
/*!while(a[i]!='\0'){
i++;
}
while(b[j]!='\0'){
j++;
}
len = i+j;
printf("i=%d, j=%d, len=%d",i,j,len);*/
len = alen+blen;
//! a[len] = '\0';
len--;
while(i>=0 || j>=0){
if(i>=0 && j>=0) {
if(a[i] >b[j]){
a[len] = a[i];
i--;
}
else {
a[len] = b[j];
j--;
}
//!a[len] = a[i]>b[j]?a[i]:b[j];
printf("%d ",a[len]);
//!i--;
//!j--;
}
else if(i>=0) {
a[len] =a[i];
printf("%d ",a[len]);
i--;
}
else {
a[len] = b[j];
printf("%d ",a[len]);
j--;
}
len--;
}
}
void print(int arr[],int len){
int i=0;
for(i=0;i<len;i++){
printf("arr[%d] = %d\n",i,arr[i]);
}
}
int main(){
int a[] = {1,5,7,9},b[] = {3,5,8};
int alen=sizeof(a)/sizeof(int);
int blen=sizeof(b)/sizeof(int);
print(a,alen);
combine2Array(a,b,alen,blen);
printf("\n");
print(a,alen);
return 1;
}