您的位置:首页 > 其它

6-2 请编写一个函数,删除一个字符串的一部分。

2016-01-12 22:50 225 查看
/*

**要求:a.不能使用任何用于操纵字符串的库函数 b.不能使用任何下表引用

**

**例如:str == "abcdefg",如果substr == "cde",那么删除子串后为abfg 返回1

**如果substr == "dexyz"则不删除任何字符,返回0

*/

/*函数原型*/

int del_substr(char *str, char const *substr);

这题目我感觉好难,仔细看了题目,首先确定思路,首先就是要判断是否是子串,如果不是就直接返回0,如果是就要进一步处理,分析,删除子串。以下是我的代码:

#if 1

#include<iostream.h>

char b[100];

size_t str_len( char const *str);

int del_substr(char *str,char const *substr);

void main()

{

char b[100];

char *src="abcdefg"; //"abcdefg" "ABCDCEFG";

char *sub_src="cde"; //

cout<<"src为"<<src<<endl;

cout<<"sub_src为 "<<sub_src<<endl;

cout<<"是否是子串 "<<del_substr(src,sub_src)<<endl;

}

int del_substr(char *str,char const *substr)

{

int len_str=str_len(str);

int len_substr=str_len(substr);

cout<<"len_substr= "<<len_substr<<endl;

int num=0;

char *str1,*str2;

char const *substr1,*substr2;

int num_char=0;

int i=0;

//str1=str;

// substr2=substr;

for(substr1=substr;*substr1!='\0';substr1++)

{ for(str1=str;*str1!='\0';str1++)

if(*substr1==*str1)

{

num_char=0;//清零重要!!!

str2=str1; //标记从src的开始相同的指针

substr2=substr1;

while(*substr2!='\0')

{

if(*substr2!=*str2)

break;

substr2++;

str2++;

num_char++;

}

if(num_char==len_substr) //是子串,处理删减,并返回1

{

//for(str1;*(str1+len_substr)!='\0';str1++)

// *str1=*(str1+len_substr);

for(str;str<str1;str++,i++)

b[i]=*str;

cout<<b<<endl;

// i--;

for(str=str2;*str!='\0';str++,i++)

b[i]=*str;

cout<<b<<endl;

// *str1='\0';

return 1;

}

}

}

return 0;

}

size_t str_len( char const *str)

{

int length=0;

while (*str++!='\0')

{

length++;

}

return length;

}

#endif

#if 0

#include<iostream.h>

void main()

{

char *a="ABCDEF";

char b[10];

for(int i=0;*(a+2)!='\0';a++,i++)

b[i]=*(a+2);

b[i]='\0';

cout<<b<<endl; //删字符之前的

}

// for(int i=0;*(a+2)!='\0';a++,i++)

// b[i]=*(a+2);

// b[i]='\0';

// cout<<b<<endl;

//}

//for(a;*(a+1)!='\0';a++)

// *a=*(a+1);

// *a='\0';

#endif

用了好多 substr2这些就是为了不改变指针,记录当时的指向位置。 一开始写好的一个版本有bug,就是比如ABCDECFGH和CF时直接输出0了,其实是子串。还有一个更严重的错误就是最底下调试删除部分 *a=*(a+1);,编译运行没问题老是内存报错,学长一开始说是指针越界,后来确定说是指向常量的指针不能修改!!

以下链接是别人写的:http://bbs.csdn.net/topics/390938998

别人写的:有空再看!

// 计算字符串长度

size_t MyStrLen(const char *str)

{

size_t nLen = 0;

while (*str++)

{

nLen++;

}

return nLen;

}

// 返回src中子串substr开始的字符指针,找不到返回NULL

char * _FindStr( char *src, const char *substr)

{

size_t nSrcLen = MyStrLen( src);

size_t nSubstrLen = MyStrLen(substr);

if (nSrcLen < nSubstrLen)

{

return NULL;

}

const char *p1 = src;

char *pBegin = src;

const char *p2 = substr;

bool bFlag = false;

while (*p1 && MyStrLen(p1) >= nSubstrLen && *p2)

{

if (*p1 == *p2)

{

p1++;

p2++;

bFlag = true;

}

else

{

bFlag = false;

pBegin++;

p1 = pBegin;

p2 = substr;

}

}

if (bFlag)

{

return pBegin;

}

return NULL;

}

int del_substr( char *str ,const char *substr)

{

if (0 == str || 0 == substr )

{

return false;

}

char *pFind = _FindStr(str,substr);

bool bFlag = false;

while (pFind)
// 循环处理,以便删除后续再次出现的子串

{

bFlag = true;

const char * pRight = pFind + MyStrLen(substr);

while (*pRight)

{

*pFind++= *pRight++;

}

*pFind = 0;

pFind = _FindStr(str,substr);

}

if (bFlag)

{

return 1;

}

return 0;

}

int main()

{

char str[] = "abcdefgcdet";

printf("原串:%s\n" ,str);

char *substr = "cde";

if (del_substr(str,substr))

{

printf("删除%s后:%s\n",substr,str) ;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: