/************
* 函數原型:char* str_rep(char *str, const char *strSearch, const char *strReplace)
* 描述:字符串替換,查找字符串,把字符串中strSearch字符串替換為strReplace
* 輸入參數:三個字符串
* 輸出參數:替換後的str
* 返回值:成功返回指向str的指針,失敗(如傳入NULL參數)返回NULL
* 分析:字符替換過程中不考慮內存溢出問題,str如果被替換後變長,要有足夠空間容納新增字符和null字符
* 改進:可以增加一個參數,傳入所能容納的最大長度,在函數裡必要時判斷新串是否到達最大長度
***************/
#include <stdio.h>
#include <string.h>
char* str_rep(char *str, const char *strSearch, const char *strReplace)
{
char *pTemp = str;
int iStrSearlen, iStrReplen, iTemp;
if (str == NULL || strSearch == NULL || strReplace == NULL)
{
return NULL;
}
iStrSearlen = strlen(strSearch);
iStrReplen = strlen(strReplace);
iTemp = iStrSearlen - iStrReplen;
if( iStrSearlen == 0 ) //如果查找字符串的長度為0(調用strstr()函數前必須考慮的),直接返回
{
return str;
}
while(pTemp = strstr(pTemp, strSearch)) //匹配到字符串,進行替換。
{
const char *p = strReplace;
if(iTemp < 0)
{
int i = strlen(str);
while (i >= pTemp-str+iStrSearlen) //i >= pTemp-str+iStrlen
{
str[i-iTemp] = str[i]; //整體向後移動-iTemp位(包括最後的'\0'),注意iTemp<0
i--;
}
while(*p != '\0') //替換字符串
{
*pTemp++ = *p++;
}
}
else
{
while(*p != '\0')
{
*pTemp++ = *p++;
}
if(iTemp > 0) //如果匹配字符比替換字符長,則整體左移iTemp位
{
strcpy(pTemp, pTemp+iTemp);
}
}
}
return str;
}
//用strncpy(substr, str+begin, len);就是substr了
char* str_sub(char *substr, const char *str, size_t begin, size_t len)
{
strncpy(substr, str+begin, len);
substr[len] = '\0';
return substr;
}
int main()
{
char str1[10]="123456789";
char str2[10]="abcdefghi";
char *p;
str1[6]='\0';
puts(str1);
p = str_rep(str1, "12", "1212");
if (p)
{
puts(p);
}
puts(str1);
puts(str_sub(str2, str1, 2, 3));
puts(str2);
return 0;
}