1 問題
把字元串裡面空格替換成百分之20
2 代碼實作
第一種時間複雜的o(n * n)實作
#include <stdio.h>
#include <stdlib.h>
char* insert(char *a, int len, char *replace, int replaceLen)
{
//先得到多少個空格
char *p = a;
int count = 0;
while (*p != '\0')
{
if (*p == ' ')
{
++count;
}
++p;
}
//計算新的字元串長度
int newLen = len + count * (replaceLen - 1);
char *newP = NULL;
newP = (char *)malloc(newLen);
if (!newP)
{
printf("malloc fail\n");
}
//新開辟記憶體的指針後面操作的時候
//我們用新的指針變量儲存新開辟記憶體的指針
char *new = newP;
//盡量不要修改原始字元串的指針位置
char *head = a;
//盡量不要修改原始需要替換字元串的位置
char *rep = replace;
while(*head != '\0')
{
if (*head != ' ')
{
*new++ = *head++;
}
else
{
*head++;
while (*rep != '\0')
{
*new++ = *rep++;
}
//這裡要記得移動指針完了之後複原替換字元串指針
rep = replace;
}
}
//尾巴要記得設定'\0'
*new = '\0';
//這裡是申請了哪個記憶體指針就傳回哪個
//千萬不要移動這個新開辟記憶體的指針
//不然後面進行free(newP)就有問題
return newP;
}
int main()
{
char a[] ="ab cd ef";
int len = sizeof(a);
char *chars = insert(a, len, "%20", 3);
printf("chars is %s\n", chars);
free(chars);
return 0;
}
3 運作結果
chars is ab%20cd%20ef
4 總結
1 在函數裡面,如果我們新開辟記憶體的指針如果要傳回,我們不要移動這個指針的位置,不然到時外面得到了開辟記憶體移動後的指針進行free的時候,會出問題,是以我們要用個指針變量儲存這個新開辟記憶體的指針,然後用指針變量進行操作記憶體資料
2 在函數裡面如果參數傳遞的是指針,我們盡量不要移動,用個指針變量儲存函數參數裡面的指針,然後用指針變量進行記憶體資料操作