在一个字符串中删除指定的字符 & 删除字符串中所有出现在另一个字符数组中的字符

#include <stdio.h>
#include <assert.h>
#include <string.h>

/*在一个字符串中删除指定的字符,这种算法只用到原来的存储空间,不用另辟空间*/
char* DeleteChar(char* str,char ch)
{
	assert(str != NULL);
	int iDes = 0;
	int iSrc = 0;
	while(str[iSrc] != '\0')
	{
		if(ch != str[iSrc])
		{
			str[iDes] = str[iSrc];
			iDes++;
			iSrc++;
		}
		else
			iSrc++;
	}
	str[iDes] = '\0';
	return str;
}


/*删除str字符串中的在ch数组中存在的字符,n为ch[]数组的长度*/
char* DeleteChar(char* str,char ch[],int n)
{
	assert(str != NULL);
	
	char tmp[256] = {0};
	int i=0;
	/*因为只有256个字符,故在操作时用tmp[256]数组来存放要删除的字符,*/
	for(i;i<n;i++)
	{
		//要删除的字符在tmp数组中对应置1
		tmp[ch[i]] = 1;
	}

	int iDes = 0;
	int iSrc = 0;
	while(str[iSrc] != '\0')
	{
		//不是要删除的字符,则进行操作。
		if(!tmp[str[iSrc]])
		{
			str[iDes] = str[iSrc];
			iDes++;
			iSrc++;
		}
		else
			iSrc++;
	}
	//记得将最后修改过后的字符串末尾添加结束符
	str[iDes] = '\0';
	return str;
}

/*上面算法的关键之一在于设置了标记读写位置的变量,这样不用增加额外的内存空间和重复的拷贝,直接在给定的空间实现了算法。
关键之二在于用一个数组来记录待删除的字符组,有利于对待删除的字符进行查找和判定。*/


void main()
{
	//注意这里应该将str定义为数组,如这种形式不行:	char* str = "Hello world!"; 会发生错误,因为这种写法,str的数据是存储在常量存储区的。
	char str[] = "Hello world!";
	//char ch = 'o';
//	char ch[] ={'w','l','o'};
	char ch[] = "wlo";
	printf("%s\n",str);
	printf("%d\n",strlen(ch));
	DeleteChar(str,ch,strlen(ch));
	printf("%s\n",str);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章