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;
}
**要求: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;
}
相关文章推荐
- Java线程状态转换
- UITabBarController
- UISwitch
- Java异常处理
- 解决: org.springframework.beans.factory.BeanNotOfRequiredTypeException办法
- 云 yun
- 虚拟增强
- 用链表编写学生管理系统(涵盖文件的输入输出)
- 正则表达式
- UISlider
- Search Insert Position
- UISegmentedControl(分段控制器)
- Android 系统属性的点滴
- UIProgressView(进度条)
- postgres简单使用
- UIPickerView(选择框)
- TrustZone——运行环境—QEMU—OP-TEE (新办法)
- UIScrollView(滑动视图)
- HLSL
- 正则表达式--处理文本