/***********************
函数的用途是:删除指定的字符
返回值是:删除后的字符串长度
str是被删除字符
ch是指定要删除的字符
***********************/

int str_sc( char * str, char * ch)	//str是被删除字符串,ch是指定要删除的字符串
{					//返回值为删除后str长度,-1为出现未知错误
	
	int n = 0, m = 0;	//n为str现阶段处理位,m是辅助ch进行对比操作
	int b = 0, y, x;//

	//事先准备
	if( *ch != '\0') {
		do 
		{ m++; }
		while( *(ch+m) != '\0'); }
	else {					//检查ch 是否为空
		printf("ch为null	-1\n");
		return -1; }
	y = m;
	if( *str != '\0') {				//检查str是否为空
		do 
		{ n++; }
		while( *(str+n) != '\0'); 
		x = n;
		if( y > n) {
			printf("ch长度大于str长度,比较无意义	0\n");
			return 0; }			
	}             
	else {
		printf("str为null	-1\n");
		return -1; }

	//主逻辑区
	n = 0;
	do {		//进行第一位对比,相同深入对比,不同n++对比下一位
		for( m = 0; (*(ch+m) != '\0') && (*(str+n) == *(ch+m)); n++, m++)
			;							//对比后续字符是否相同
		if( m == y)						//根据m的值,确定匹配到一个ch
			b = b + m;
		else if( (m > 0) && (m < y))	//匹配失败
			n = n - m + 1;				//还原继续匹配
		else if(m == 0)
			n++;
		else{
			printf("出现未知错误	-1\n");
			return -1; }
		if((n-b) != n) 
			str[n-b] = str[n];	//进行移动
		if( *(str+n) == '\0') {
			*(str+n-b) = '\0';
			return n-b;		}		}
	while(n <= x);
	return -1;
}

/****************************************
	现在想到的函数漏洞有:
没有检测	ch 和 str 中是否存在'/0'的对应代码   要是传入的字符串没有'\0'  那结果酸爽
不知道大家除了传入字符串长度的这个方法外,有没有能在内部解决这个问题的方法?
****************************************/