#pragma once
#include <iostream>
#include <string>
#include <cassert>
#include <iomanip>
using namespace std;
//自己写函数 http://blog.csdn.net/herveyhuang/article/details/39755991
unsigned int mystrlen(const char* str);
char* mystrcat(char* dest,const char* src);
char* mystrchr(char* str,char c);
int mystrcmp(const char* str1,const char* str2);
char* mystrcpy(char* dest,const char* src);
unsigned int mystrcspn ( const char * str1, const char * str2 );
char* mystrncat(char* dest,const char* src,unsigned int num);
int mystrncmp(const char* str1,const char* str2,unsigned int num);
char* mystrncpy(char* dest,const char* src,unsigned int num);
char* mystrpbrk(char* str1,char* str2);
char* mystrrchr(char* str,char c);
unsigned int mystrspn(char* str1,char* str2);
char* mystrstr(char* str,char* strSearch);
class MyString{
friend ostream& operator <<(ostream&,MyString&);
friend istream& operator >>(istream&,MyString&);
public:
MyString(const char* str = NULL);
//assignment constructor
MyString(const MyString& str);
~MyString(){
delete [] m_data;
}
//get the length of string
int size(){
return mystrlen(m_data);
}
//return substring 这里存在一些问题待改善
//当字符串的长度稍大一些时会出错;
MyString substr(int pos);
MyString substr(int pos,int len);
//overload operator =
MyString& operator =(const MyString& other);
//overload operator +
MyString operator +(const MyString& other)const;
//overload operator +=
MyString& operator +=(const MyString& other);
//overload operator ==
bool operator ==(const MyString& other)const;
//overload operator []
char& operator [](unsigned int);
private:
char* m_data;
};
#include "MyString.h"
MyString::MyString(const char* str /* = NULL */)
{
if (!str)
{
m_data = new char[1];
*m_data = '\0';
}
else
{
int nLen = mystrlen(str);
m_data = new char[nLen + 1];
mystrcpy(m_data,str);
}
}
MyString::MyString(const MyString& str)
{
m_data = new char[mystrlen(str.m_data)+1];
mystrcpy(m_data,str.m_data);
}
ostream& operator <<(ostream& oscout,MyString& str)
{
oscout<<str.m_data;
return oscout;
}
istream& operator >>(istream& iscin,MyString& str)
{
char temp[255];
iscin>>setw(255)>>temp;
str = temp;
return iscin;
}
MyString MyString::substr(int pos)
{
/*
int nLen = mystrlen(m_data);
char* res = new char(nLen - pos +1);
char* src = m_data + pos;
mystrncpy(res,src,nLen-pos);
MyString strres(res);
return strres;
*/
int nLen = mystrlen(m_data);
if (nLen < pos)
{
pos = nLen;
}
int nCopyLen = nLen - pos;
char* res = new char(nLen - pos +1);
char* dest = res;
char* src = m_data + pos;
for (int i = 0;i < nCopyLen; i++)
{
*dest++ = *src++;
}
*dest = '\0';
MyString strres(res);
return strres;
}
MyString MyString::substr(int pos,int len)
{
int maxlen = mystrlen(m_data)-pos;
int newLen = maxlen < len ? maxlen : len;
char* res = new char(newLen+1);
char* src = m_data + pos;
mystrncpy(res,src,newLen);
MyString strres(res);
return strres;
}
MyString MyString::operator +(const MyString& other)const
{
MyString newString;
if(!other.m_data)
newString = *this;
else if(!m_data)
newString = other;
else
{
newString.m_data = new char[mystrlen(m_data)+mystrlen(other.m_data)+1];
mystrcpy(newString.m_data,m_data);
mystrcat(newString.m_data,other.m_data);
}
return newString;
}
MyString& MyString::operator =(const MyString& other)
{
if (this!=&other)
{
delete [] m_data;
if(!other.m_data)
{
m_data = new char[1];
*m_data = '\0';
}
else
{
m_data = new char[strlen(other.m_data)+1];
mystrcpy(m_data,other.m_data);
}
}
return *this;
}
MyString& MyString::operator +=(const MyString& other)
{
if (!other.m_data)
{
return *this;
}
else
{
char* data = new char[mystrlen(m_data)+mystrlen(other.m_data)+1];
mystrcpy(data,m_data);
delete [] m_data;
m_data = data;
mystrcat(m_data,other.m_data);
}
return *this;
}
//overload operator ==
bool MyString::operator ==(const MyString& other)const
{
if ( mystrlen(other.m_data) != mystrlen(m_data) )
return false;
return mystrcmp(m_data,other.m_data)?false:true;
}
//overload operator []
char& MyString::operator [](unsigned int index)
{
if (index >= 0 && index <= mystrlen(m_data))
return m_data[index];
return m_data[mystrlen(m_data)+1];
}
自己写了一下string类的一些函数,这里看起来很简单的东西,费了好长时间啊,还有一点就是其中一个函数存在问题,带改善
//return substring 这里存在一些问题待改善
//当字符串的长度稍大一些时会出错;
MyString substr(int pos);
MyString substr(int pos,int len);