分享
 
 
 

自定义类_string类

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

// 操作符重载实验

// 一点疑问:

// 程序中多次用到

// char *str = new char(n);

// 分配空间。

// 但没有

// ???

// delete[]str; || delete str;

// ???

// 撤销空间。

// 是否会造成内存泄漏?

// 但如果用delete...总是出错

// 如在析构函数中加

// delete[]str; //出错

//

// 请指点!!!

////////////////////////////////////////////////////////////

// string类源程序

// 时间: 2005-11-2

// 程序员: 黄江斌( blog主页 http://blog.csdn.net/zerodspace

// 开发平台: VC++6.0<<单文件程序>>

////////////////////////////////////////////////////////////

#include "iostream.h"

////////////////////////////////////////////////////////////

// string类声明部分

// 时间: 2005-11-2

// 程序员: 黄江斌

////////////////////////////////////////////////////////////

#include "string.h"

#define TRIM_LEFT 1

#define TRIM_RIGHT 2

#define TRIM_BOTH 0

class string

{

public:

string();

string( const char *src );

string( string &src );

~string();

//操作符重载

void operator = ( const char *src );

//char * operator + ( string &add2 );

string operator + ( string &add2 );

operator char *();

//成员函数

const char *ToString();

char GetAt( int index );

int Len();

int FindFirstSub( string substr , int start );

bool InStr( string substr );

string Trim( int part );

string Left( int sublen );

string Right( int sublen );

string Mid( int start , int sublen );

void Replace( string strNeedReplaced , string strReplace );

private:

char *str;

int len;

};

////////////////////////////////////////////////////////////

// string类实现部分

// 时间: 2005-11-2

// 程序员: 黄江斌

////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////

// string在构造、析构函数

// string()

// string( const char *src )

// string( string &src )

// ~string()

string::string()

{

len = 0;

str = new char(len+1);

str[0] = 0;

}

string::string( const char *src )

{

len = strlen(src);

str = new char(len+1);

strcpy( str , src );

}

string::string( string &src )

{

len = src.Len();

str = new char(len+1);

strcpy( str , (char*)src );

}

string::~string()

{

}

////////////////////////////////////////////////////////////

// string类操作符重载

// string operator = ( const char *src )

// string operator + ( string &add2 )

// operator char *()

void string::operator = ( const char *src )

{

len = strlen(src);

str = new char(len+1);

strcpy( str , src );

}

string string::operator + ( string &add2 )

{

int len2 = add2.Len();

int len0 = len + len2;

char *str0 = new char(len0+1);

strcpy( str0 , str );

strcat( str0 , (char*)add2 );

string sum(str0);

return sum;

}

string::operator char *()

{

return str;

}

////////////////////////////////////////////////////////////

// string类功能函数

// const char *ToString()

// char GetAt( int index )

// int Len()

// int FindFirstSub( string substr , int start = 0 )

// bool InStr( string substr )

// string Trim( int part )

// string Left()

// string Right()

// string Mid()

// void Replace( string strNeedReplaced , string strReplace )

const char *string::ToString()

{

return str;

}

//

//得到内存编号为index的字符

char string::GetAt( int index )

{

return str[index];

}

//

//得到字符串的长度

int string::Len()

{

return len;

}

//

//得到start后(包括start)子串substr的内存编号

int string::FindFirstSub( string substr , int start = 0 )

{

if( start > len )

return -1;

for( int i = start ; i <= len - substr.Len() ; i++ )

{

if( str[i] == substr.GetAt(0) )

{

bool flag = true;

int j;

for( j = 0 ; flag && j < substr.Len() && (i + j < len) ; j++ )

{

if( str[i+j] != substr.GetAt(j) )

flag = false;

}

if( j >= substr.Len() && flag )

{

return i;

}

}

}

return -1;

}

//

//判断字符串substr是否字符串的子串

bool string::InStr( string substr )

{

if( FindFirstSub( substr ) < 0 )

return false;

else

return true;

}

//

//去前导、后导空格

string string::Trim( int part = TRIM_BOTH )

{

string s = *this;

char *temp = new char(Len()+1);

int i , j , k;

if( part == TRIM_LEFT || part == TRIM_BOTH )

{

j = 0;

while( s.GetAt(j) == ' ' && j < s.Len() )

j++;

k = s.Len();

i = 0;

while( j <= k )

temp[i++] = s.GetAt(j++);

s = (string)temp;

}

if( part == TRIM_RIGHT || part == TRIM_BOTH )

{

j = s.Len() - 1;

while( s.GetAt(j) == ' ' )

j--;

for( i = 0 ; i <= j ; i++ )

temp[i] = s.GetAt(i);

temp[i] = 0;

s = (string)temp;

}

return s;

}

//

//字符串左部长度为sublen的子串

string string::Left( int sublen )

{

if( sublen > len )

sublen = len;

char *substr = new char(sublen+1);

for( int i = 0 ; i < sublen ; i++ )

substr[i] = str[i];

substr[sublen] = 0;

string sub(substr);

return sub;

}

//

//字符串右部长度为sublen的子串

string string::Right( int sublen )

{

if( sublen > len )

sublen = len;

char *substr = new char(sublen+1);

for( int i = 0 ; i < sublen ; i++ )

substr[i] = str[len-sublen+i];

substr[sublen] = 0;

string sub(substr);

return sub;

}

//

//字符串中间从start开始长度为sublen的子串

string string::Mid( int start , int sublen )

{

if( start > len || sublen <= 0 )

{

string sub("");

return sub;

}

if( start + sublen > len )

sublen = len - start;

char *substr = new char(sublen+1);

for( int i = 0 ; i < sublen ; i++ )

substr[i] = str[start+i];

substr[sublen] = 0;

string sub(substr);

return sub;

}

//

//将字符串中所有形如strNeedReplaced的子串替换为strReplace

void string::Replace( string strNeedReplaced , string strReplace )

{

string temp;

int start = 0;

int index = FindFirstSub( strNeedReplaced , start );

while( index >= 0 )

{

temp = temp + Mid( start , index - start ) + strReplace;

start = index + strNeedReplaced.Len();

index = FindFirstSub( strNeedReplaced , start );

}

temp = temp + Right( len - start );

len = temp.Len();

str = new char(len+1);

strcpy( str , (char*)temp );

}

// string类结束

////////////////////////////////////////////////////////////

void main()

{

string str = " a b c ";

cout<<str<<"|"<<endl;

while( str.InStr( " " ) )

str.Replace( " " , " " );

cout<<str.Trim()<<"|"<<endl;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有