#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);
}