int GetFindStrCount(char* src, char* find)
{  
 int count = 0;  
 char* position =src;  
 int findLen = strlen(find);  
 while((position = strstr(position, find)) != NULL)
 {  
 count++;  
 position = position + findLen;  
 }  
 return count;  
}
/************************************************************************/
/* @param src  要替换的字符串   
/* @param des  替换后的字符串存放
/* @param find 所要替换的字符串
/* @param replaceWith 要替换的字符串
/************************************************************************/
char* ReplaceAll(char* src,char *des, char* find, char* replaceWith)
{  
 //如果find或者replace为null,则返回和src一样的字符串。  
 if(find == NULL || replaceWith == NULL)
 {  
 return strdup(src);  
 }  
 //指向替换后的字符串的head。  
 char* afterReplaceHead = NULL;  
 //总是指向新字符串的结尾位置。  
 char* afterReplaceIndex = NULL;  
 //find字符串在src字符串中出现的次数  
 int count = 0;  
 int i,j,k;  
 int srcLen = strlen(src);  
 int findLen = strlen(find);  
 int replaceWithLen = strlen(replaceWith);  
 //指向src字符串的某个位置,从该位置开始复制子字符串到afterReplaceIndex,初始从src的head开始复制。  
 char* srcIndex = src;  
 //src字符串的某个下标,从该下标开始复制字符串到afterReplaceIndex,初始为src的第一个字符。  
 int cpStrStart = 0;  
 //获取find字符串在src字符串中出现的次数  
 count = GetFindStrCount(src, find);  
 //如果没有出现,则返回和src一样的字符串。  
 if(count == 0)
 {  
 return strdup(src);  
 }  
 //为新字符串申请内存  
 afterReplaceHead = afterReplaceIndex = des; 
 //初始化新字符串内存  
 memset(afterReplaceHead, ‘\0‘,sizeof(afterReplaceHead));  
 for(i = 0,j = 0,k = 0;i!=srcLen;i++)
 {  
 //如果find字符串的字符和src中字符串的字符是否相同。  
 if(src[i] == find[j])
 {  
 //如果刚开始比较,则将i的值先赋给k保存。  
 if(j == 0)
 {  
 k = i;  
 }  
 //如果find字符串包含在src字符串中  
 if(j == (findLen-1))
 {  
 j = 0;  
 //拷贝src中find字符串之前的字符串到新字符串中  
 strncpy(afterReplaceIndex, srcIndex, i - findLen - cpStrStart + 1);  
 //修改afterReplaceIndex  
 afterReplaceIndex = afterReplaceIndex + i - findLen - cpStrStart + 1;  
 //修改srcIndex  
 srcIndex = srcIndex + i - findLen - cpStrStart + 1;  
 //cpStrStart  
 cpStrStart = i + 1;               
 //拷贝replaceWith字符串到新字符串中  
 strncpy(afterReplaceIndex, replaceWith, replaceWithLen);  
 //修改afterReplaceIndex  
 afterReplaceIndex = afterReplaceIndex + replaceWithLen;  
 //修改srcIndex  
 srcIndex = srcIndex + findLen;  
 }
 else
 {  
 j++;  
 }  
 }
 else
 {  
 //如果find和src比较过程中出现不相等的情况,则将保存的k值还给i  
 if(j != 0)
 {  
 i = k;  
 }  
 j = 0;  
 }  
 }  
 //最后将src中最后一个与find匹配的字符串后面的字符串复制到新字符串中。  
 strncpy(afterReplaceIndex, srcIndex, i - cpStrStart);  
 return afterReplaceHead;  
}  
原文:http://my.oschina.net/Cosco/blog/333016