删除特定字符

来源:互联网 发布:朝阳区群众知乎 编辑:程序博客网 时间:2024/05/16 09:54

题目大意:编写一个高效率的算法来删除字符串中的给定字符。比如,“This is a student!”是源字符串,“aeiou”是删除字符串,则结果为“Ths s   stdnt!”.


一开始想到新建两个数组,一个用下标表示删除字符串中出现的字符,一个用来存储经过处理的字符串,结果输出第二个数组,代码如下:

#include <iostream>#include <string.h>using namespace std;static char Remove_List[256];void DeleteChar(char *Source,char *Remove){    int i;    int n = strlen(Source);    int m = strlen(Remove);    char Source_Result[n];    for(i = 0;i < 256;i++)    {        Remove_List[i] = 0;    }    for(i = 0;i < m;i++)    {        Remove_List[Remove[i]] = 1;    }    int index = 0;    for(i = 0;i < n;i++)    {        if(Remove_List[Source[i]] == 0)        {            Source_Result[index] = Source[i];            index++;        }    }    for(i = 0;i < index;i++)    {        cout<<Source_Result[i];    }    cout<<endl;}int main(){    int n,m,i;    char Source[] = "This is a student!";    char Remove[] = "aeiou";    DeleteChar(Source,Remove);    return 0;}

后来尝试了省略第二个数组,直接在源字符串上修改,代码如下:

#include<iostream>#include<string.h>using namespace std;void DeleteChars(char *Source, char *Remove){if(Source==NULL || Remove==NULL)return;//Remove_List标记字符是否在字符串second中出现...bool Remove_List[256];memset(Remove_List,0,sizeof(Remove_List));size_t len1 = strlen(Source);size_t len2 = strlen(Remove);//扫描字符串Remove,在Remove_List中标记出现的字符for(int i=0; i<len2; i++)if(!Remove_List[Remove[i]])Remove_List[Remove[i]] = true;char *slow = Source;char *fast = Source;//删除Source中出现在Remove中的字符while(*fast != '\0'){if(!Remove_List[*fast]){*slow = *fast;++slow;}++fast;}*slow = '\0';}int main(){char Source[] = "This is a student!";char Remove[] = "aeiou";DeleteChars(Source,Remove);cout<<Source<<endl;return 0;}

另外要注意的是,如果我们将char Source[] = "This is a student!"改为char *Source = "This is a student!",则执行时会错误。

因为char *Source = "This is a student!"中,Source指针指向的是一个常量内存区,通过传址方式改变其中的值当然会报错。而char Source[] = "This is a student!"中Source是一个一维数组,且"This is a student!"存在的区域也不是在常量内存区,所以可以改变其值。

举例说明其他情况:

*pp = "abc";

p[] = "abc";

*pp指向的是字符串中的第一个字符。

cout<<pp;  返回pp地址开始的字符串:abc

cout<<p;    返回p地址开始的字符串:abc

cout<<*p;  返回第一个字符:a

cout<<*(p+1);  返回第二个字符串:b

cout<<&p[1];    返回从第二个字符开始的字符串:bc

0 0
原创粉丝点击