说明
如果想直接下载程序包请访问:https://github.com/ouzhiming/C-string-class
以下程序只能在Ubuntu下运行,我在VS2017下测试,总是出现错误,如果有人修改了这个错误,希望可以和我交流一下。这个程序目前还没写完,测试的也不够完善,欢迎大家指出不足和错误。
函数设计:CMyString.h
#ifndef _CMYSTRING_H
#define _CMYSTRING_H
#include <cstring>
#include <ostream>
#include <iostream>
class CMyString
{
friend std::ostream& operator<<( std::ostream& os, const CMyString& str);
private:
char* m_pData; // 私有变量保存字符串
int m_len; //字符串的长度
public:
/*
* 构造函数
*/
CMyString(); //默认构造函数
CMyString( const char* str ); // C字符串构造函数
CMyString( const int &num, const char &c); //num个字符c
CMyString( const char* str, const int &len); //将C字符串前len个字符作为字符串s的初值。
CMyString( const CMyString& str ); // 拷贝构造函数
CMyString( const CMyString& str, const int &index); //从索引index的拷贝构造函数
CMyString( const CMyString& str, const int &index, const int &len);//从索引index的、长度为len的拷贝构造函数
~CMyString( void ); // 析构函数
/*
*字符串操作函数
*/
CMyString& operator=( const CMyString& str ); // 赋值运算符
CMyString operator+( const CMyString& str ); // 字符串连接
bool operator==( const CMyString& str ); // 判断相等
char operator[](const int idx ); // 数组索引
int getLength(); // 返回长度
char * getString();//返回C类型字符串
void swap(CMyString &str1, CMyString &str2); //交换2个字符串的值
CMyString & insert(CMyString str, const int &index); //在索引index处插入字符
//std::ostream& operator<<(std::ostream& os, const CMyString& str);
//std::ostream & operator<<(std::ostream & os);
};
#endif
函数实现:CMyString.cpp
#include "CMyString.h"
using namespace std;
CMyString::CMyString()//默认构造函数
{
this->m_len = 0;
this->m_pData = new char(this->m_len + 1);
this->m_pData[0] = '\0';
}
// C字符串构造函数
CMyString::CMyString(const char* str)
{
if (!str){
this->m_len = 0;
this->m_pData = new char(this->m_len + 1);
this->m_pData[0] = '\0';
}
else{
this->m_len = strlen(str);
this->m_pData = new char[this->m_len + 1];
strcpy(this->m_pData, str);
//另一种实现方式,strcpy_s保证缓冲区尺寸,避免发生不可预料的事,故这里使用strcpy_s
// strcpy_s(this->m_pData, this->m_len + 1, str);
}
}
//num个字符c
CMyString::CMyString(const int &num, const char &c)
{
if (num <= 0) {
this->m_len = 0;
this->m_pData = new char(this->m_len + 1);
this->m_pData[0] = '\0';
}
else {
this->m_len = num;
this->m_pData = new char(this->m_len + 1);
for (int i = 0; i < this->m_len; i++) {
this->m_pData[i] = c;
}
}
}
//将C字符串前len个字符作为字符串s的初值。
CMyString::CMyString(const char* str, const int &len)
{
if (len <= 0) {
this->m_len = 0;
this->m_pData = new char(this->m_len + 1);
this->m_pData[0] = '\0';
}
else {
int len_temp = strlen(str);
if (len_temp >= len) {
this->m_len = len;
this->m_pData = new char(this->m_len + 1);
strncpy(this->m_pData,str, this->m_len);
this->m_pData[this->m_len + 1] = '\0'; //strncpy不会追加‘\0’,所以这里手动加
/*for (int i = 0; i < this->m_len + 1; i++) {
this->m_pData[i] = str[i];
}*/
}
else{ //len大于字符串str本身的长度
this->m_len = len_temp;
this->m_pData = new char(this->m_len + 1);
//strcpy_s(this->m_pData, this->m_len + 1, str);
strcpy(this->m_pData, str);
}
}
}
// 拷贝构造函数
CMyString::CMyString(const CMyString& str)
{
if (!str.m_len)
{
this->m_len = 0;
this->m_pData = new char( this->m_len + 1);
this->m_pData[0] = '\0';
}
else
{
this->m_len = str.m_len;
this->m_pData = new char[this->m_len + 1];
// strcpy_s(this->m_pData, this->m_len + 1, str.m_pData);
strcpy(this->m_pData, str.m_pData);
}
}
//从索引index的拷贝构造函数
CMyString::CMyString(const CMyString& str, const int &index)
{
if(str.m_len == 0 || index >= str.m_len){
this->m_len = 0;
this->m_pData = new char( this->m_len +1 );
this->m_pData[0] = '\0';
}
else{
this->m_len = str.m_len - index;
this->m_pData = new char( this->m_len + 1);
int j = 0;
for(int i = index; i < str.m_len; i++){
this->m_pData[j++] = str.m_pData[i];
}
}
}
//从索引index的、长度为len的拷贝构造函数
CMyString::CMyString(const CMyString& str, const int &index, const int &len)
{
if(str.m_len == 0 || index >= str.m_len){
this->m_len = 0;
this->m_pData = new char( this->m_len +1 );
this->m_pData[0] = '\0';
}
else{
int j = 0;
if(len <= str.m_len - index){
this->m_len = len;
this->m_pData = new char(this->m_len + 1);
for(int i = index; i < index + len; i++){
this->m_pData[j++] = str.m_pData[i];
}
}
else{
this->m_len = str.m_len - index;
this->m_pData = new char(this->m_len + 1);
for(int i = index; i < str.m_len; i++){
this->m_pData[j++] = str.m_pData[i];
}
}
}
}
//析构函数
CMyString::~CMyString( void )
{
if ( this->m_pData)
{
delete[] this->m_pData;
this->m_len = 0;
this->m_pData = 0;
}
}
CMyString& CMyString::operator=( const CMyString& str)
{
if (this == &str)
return *this;
else //如果2个地址不同
{
//先释放原来的字符串
delete[] this->m_pData;
if ( str.m_len == 0 )
{
this->m_len = 0;
this->m_pData = new char(this->m_len + 1);
this->m_pData[0] = '\0';
}
else
{
this->m_len = str.m_len;
this->m_pData = new char[this->m_len + 1 ];
//strcpy_s( this->m_pData, this->m_len + 1, str.m_pData );
strcpy(this->m_pData, str.m_pData);
}
}
return *this;
}
CMyString CMyString::operator+( const CMyString& str )
{
CMyString newString;
if ( str.m_len == 0 )
{
newString = *this;
}
else if ( this->m_len == 0 )
{
newString = str;
}
else
{
newString.m_len = this->m_len + str.m_len;
newString.m_pData = new char[newString.m_len + 1 ];
//strcpy_s( newString.m_pData, newString.m_len + 1, this->m_pData );
strcpy(newString.m_pData, this->m_pData);
strcat( newString.m_pData, str.m_pData );
}
return newString;
}
bool CMyString::operator==( const CMyString& str )
{
if ( this->m_len != str.m_len )
{
return false;
}
else
{
return strcmp( this->m_pData, str.m_pData ) ? false : true;
}
}
char CMyString::operator[]( const int idx )
{
if ( idx > 0 && idx < strlen( this->m_pData ) )
return this->m_pData[idx];
}
int CMyString::getLength()
{
return this->m_len;
}
std::ostream& operator<<( std::ostream& os, const CMyString& str )
{
os<< str.m_pData;
return os;
}
char * CMyString::getString() {
return this->m_pData;
}
测试文件: main.cpp
#include "CMyString.cpp"
#include <iostream>
int main()
{
CMyString str("sly");
std::cout << str.getString() << std::endl;
std::cout << str << std::endl;
CMyString str1;
str1 = str;
std::cout << str1 << std::endl;
std::cout << str1[1] << std::endl;
int len = str1.getLength();
std::cout << "len = " << len << " " << str1[len] << std::endl;
if(str == str1)
std::cout << "相等" << std::endl;
str = str + str1;
std::cout << str << std::endl;
if(str == str1)
std::cout << "相等" << std::endl;
else
std::cout << "不相等"<< std::endl;
CMyString str2(10,'w');
std::cout << str2 << std::endl;
CMyString str3("asdfg123",5);
std::cout << "str3 = "<< str3 << std::endl;
CMyString str4(str3, 1);
std::cout << "str4 = " << str4 << std::endl;
CMyString str5(str3, 1, 9);
std::cout << "str5 = " << str5 << std::endl;
return 0;
}
参考文献
1.string类实现(C++):http://www.cnblogs.com/liwenbin/p/3724549.html
2.【C++】String类中的运算符重载:
http://blog.csdn.net/irean_lau/article/details/46400553