将字符串szSrc中找到的每一个szFind字符串替换为szRep
*主要思路:若无匹配字符串,返回原字符串。若有,新建一个指针指向关键字符串之后的字符串,截取关键字符串之前的字符串,与Replacement拼接,得到的结果再与关键字符串之后的字符串拼接
注意事项:szRep 中含有 szFind的情况
malloc资源的释放
//
// strrep.c
//
//
// Created by Lancer on 15-1-14.
//
//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#undef strrep
#define MAXSIZE 100
#define ERROR 0
int strstr_int(char *s1, const char *s2);
int countFind(char *src, const char *find);
char *strrep(char *szSrc, const char *szFind, char *szRep);
char *strstr_n(char *s1, const char *s2, int n);
int main()
{
char strSrc[MAXSIZE] = "abc123abc";
const char *strFind = "abc";
char *strReplace = "【repabc】";
char strSrc[MAXSIZE] = "";
printf("请输入 strSrc: \n ");
gets(strSrc);
char *strTemp = strSrc;
printf("原字符串:\t%s \n关键字符串:\t%s \n替代字符串:\t%s \n", strSrc, strFind, strReplace);
strTemp = strrep(strSrc, strFind, strReplace);
printf ("替换结果为:\t%s\n", strTemp);
}
/**
* 将字符串szSrc中找到的每一个szFind字符串替换为szRep
*主要思路:若无匹配字符串,返回原字符串。若有,新建一个指针指向关键字符串之后的字符串,截取关键字符串之前的字符串,与Replacement拼接,得到的结果再与关键字符串之后的字符串拼接
*@param szSrc 待查字符串
*@param szFind 关键字符串
*@param szRep 替换字符串
*@return: 返回替换后的字符串头指针
*
*/
char *strrep(char *szSrc, const char *szFind, char *szRep)
{
char *sTmp = (char *) malloc (MAXSIZE * sizeof(char));
char *strContinue = szSrc;
int count = 1; //记录替换的次数,用于跳过前 count 个匹配关键字
//int cutEnd = 0;
strncpy (sTmp, szSrc, strlen (szSrc));
if (!szFind)
{
printf("szFind error!\n");
return 0;
}
int findLen = strlen (szFind);
printf("strContinue = %p\n", strContinue);
//循环查找替换后的字符串,继续替换
while (countFind (strContinue, szFind))
{
strContinue = strstr (strContinue, szFind) + findLen; //关键字符串之后字符的指针
//判断替换字符串中是否有关键字符串
if (!countFind(szRep, szFind))
{
*(strstr (sTmp, szFind)) = '\0'; //截取前串
}
else
{
*(strstr_n (sTmp, szFind, count * countFind(szRep, szFind))) = '\0';
}
count++;
strcat (sTmp, szRep);
strcat (sTmp, strContinue);
}
szSrc = strcpy (szSrc, sTmp) ;
free (sTmp);
return szSrc;
}
/**
* 在s1中找到s2字符串第一次出现时的字符下标
*@param s1 待查字符串
*@param s2 关键字符串
*@return 返回s1中第一次出现s2字符串时的字符下标
*
*/
int strstr_int(char *s1, const char *s2)
{
return (countFind(s1, s2)?(strstr(s1, s2) - s1) : 0) ;
}
/**
*函数描述:在src中统计字符串find出现的个数
*@param src 待查字符串
*@param find 关键字符串
*@return src中find出现的次数
*
*/
int countFind(char *src, const char *find)
{
char *pSrc = src;
const char *pFind = find;
char *pSrcEnd = src + strlen (src); //pSrcEnd为src末位置指针
char *prev = NULL; //一个用于匹配的临时指针
int findLen = strlen (find); //len为find的长度
int count = 0;
//统计关键串出现次数
for ( ; *pSrc; pSrc++)
{
if (pSrcEnd - pSrc < findLen) break; //若开始匹配串就比原串大,退出
for (prev = pSrc; *prev == *pFind; prev++, pFind++)
{
if (*(pFind + 1) == 0)
{
count++;
pFind = find;
break;
}
}
}
return count;
}
/**
*返回 s1中的第 n 个 s2 字符串的首指针
*@param s1 待查字符串
*@param s2 关键字符串
*@param n 跳过前 n 个字符串
*@return s1中的第 n 个 s2 字符串的首指针
*
*/
char *strstr_n(char *s1, const char *s2, int n)
{
char *p = s1;
int findLen = strlen (s2);
for(; (p = strchr(p, *s2)) != 0; p++)
{
if(strncmp (p, s2, findLen) == 0 )
{
--n;
if(!n)
return (char *)p;
}
}
return 0;
}