• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

C语言编写的ReplaceAll函数

OC/C/C++ 水墨上仙 1815次浏览

C语言编写的ReplaceAll函数
转自:http://blog.csdn.net/todd911/article/details/7900841

#include <stdio.h>
#include <malloc.h>
#include <string.h>
char* replaceAll(char* src, 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 = (char*)malloc(srcLen + 1 + (replaceWithLen - findLen) * count);
    //初始化新字符串内存
	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;
}
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;
}
int main(void){
	char* s = "12345345443344341334542345";
	//调用函数replaceAll,s为源字符串,"345"为需要替换的字符串,”7890“为替换目的字符串。
	char* r = replaceAll(s, "345", "7890");
	printf("%s\n",r);
	//使用replaceAll函数后一定要free掉,因为replace内部会malloc结果字符串的内存。
	free(r);
	return 0;
}


喜欢 (0)
加载中……