厚积薄发—C++标准库string类的扩展(暂行稿)

//===============================写在前面===============================
在标准C++中,有两种形式的字符:
分别是C语言的C风格字符串和C++标准库中的string类。

其中C风格的字符串以字符数组 char*或者char[]来实现,
但是功能很弱,而且很不安全。

标准C++采用类模板的形式来封装字符串,建议使用。

头文件说明:

C风格字符串: 
#include <string.h> //这是C语言和非标准C++用的老式的头文件
#include <cstring>  //这是标准C++用的新式的头文件
//string.h和cstring在功能上基本类似
//只是后者的内容都放在命名空间std中

标准C++的string类头文件
#include <string> //所有内容放在命名空间std中

注1:
    string.h和cstring基本相同,后者是前者的替代版本。
    但是和string完全是两个不同的头文件。

注2:在MFC中还有一个功能更强大的类CString类来处理字符串
//==========================================================================
经过多日准备,现在发布我写的C++标准库string类的扩展stringEx类(暂时稿)
之所以称为暂行稿的原因:
1.
  现在发布的功能还比较少,有待增加
2.
  stringEx直接将string的对象作为成员变量进行string类的扩展,
  这种做法是正确的,但是,却不是很好,因此只是暂行。
  我写的C++代码不但要正确,更要追求C++标准,还要符合高级的C++编程规范。
  虽然不标准和不和高级规范都是正确的,但不能让我满足。
3.
  C++的高级编程规范向程序员建议:不要将基类的对象作为派生类的成员变量。
//==========================================================================

源代码如下:

/*- ==========================================================
*     文件名  :stringEx.h
*     开发人员:袁培荣
*     当前版本:1.0.0.2595
*     创建时间:2012-04-22
*     修改时间:2012-05-08
*     功能说明:C++标准库string类的扩展(暂行稿)
*     版权说明:版权所有 袁培荣 YuanPeirong 
*     编译环境:Windows 7(x64) SP1 简体中文专业版
*     编译器:  Visual Studio 2010 SP1(中文旗舰版)
				MinGW 2011118
				Visual C++ 6.0 SP6(中文企业版)
- ==========================================================*/

#ifndef stringEx_H_TYCppStdLib
#define stringEx_H_TYCppStdLib

#ifdef stringEx_DLL_API
#else
#define stringEx_DLL_API _declspec(dllimport)
#endif

#include <string>

using std::string;

namespace TYCppStdLib
{   
	class stringEx_DLL_API stringEx : public string
	{
	private:
		string m_strEx;
	public:
		//构造函数
		
		    //为本类和基类共同构造
		stringEx();		
		    //为本类构造
		stringEx(string str);       
		    //为基类string构造
		stringEx(const char *str);  
		stringEx(size_type length, char ch);                      
		stringEx(const char *str, size_type length);              
		stringEx(string &str, size_type index, size_type length); 
		stringEx(const_iterator start, const_iterator end);
		
		//虚析构函数
		virtual ~stringEx();

		//同步对象本身和m_strEx的值
		void Synchronous(bool positive=true); 

		//获取m_strEx
		string GetString();
		void GetString(string &getString);
		
		//设置m_strEx
		void SetString(string setString);
		
		//内联函数(是否数字,字母转大写,字母转小写)
		inline bool IsDigitInline(char *buf)
		{
		    return((*buf & 0x10) ? 1 : (*buf =='.'));
		}
		inline char CharToUpperInline(unsigned char c)
		{
		    return ((c >= 'a' && c <= 'z') ? c-('a'-'A') : c );
		}
		inline char CharToLowerInline(unsigned char c)
		{
		    return ((c >= 'A' && c <= 'Z') ? c+('a'-'A') : c );
		}
		
		// bool IsDigit(char *buf);
		// char CharToUpper(unsigned char c);
		// char CharToLower(unsigned char c);
		
		//判断字符串是不是数字
		bool IsNumeric();
		bool IsNumeric(string stString);
		bool IsNumeric(string *stString);
		//bool IsNumeric(string &stString);
		
		//字符串中所有字母转为大写形式
		string Upcase(bool UpMe=false);
		string Upcase(string stString);
		void Upcase(string *stString);
		//void Upcase(string &stString);
		
		//字符串中所有字母转为小写形式
		string Lowercase(bool LowMe=false);
		string Lowercase(string stString);
		void Lowercase(string *stString);
		//void Lowercase(string &stString);

		//去掉左边指定字符串
		string LTrim(bool LTrMe=false, string LTrStr=" ");
		string LTrim(string stString, string LTrStr=" ");
		void LTrim(string *stString, string LTrStr=" ");
		//void LTrim(string &stString, string LTrStr=" ");

		//去掉右边指定字符串
		string RTrim(bool RTrMe=false, string RTrStr=" ");
		string RTrim(string stString, string RTrStr=" ");
		void RTrim(string *stString, string RTrStr=" ");
		//void RTrim(string &stString, string RTrStr=" ");
		
		//去掉两边指定字符串
		string Trim(bool TrMe=false, string TrStr=" ");
		string Trim(string stString, string TrStr=" ");
		void Trim(string *stString, string TrStr=" ");
		//void Trim(string &stString, string TrStr=" ");
	};
}

#endif

/*- ==========================================================
*     文件名  :stringEx.cpp
*     开发人员:袁培荣
*     当前版本:1.0.0.2595
*     创建时间:2012-04-22
*     修改时间:2012-05-08
*     功能说明:C++标准库string类的扩展(暂行稿)
*     版权说明:版权所有 袁培荣 YuanPeirong 
*     编译环境:Windows 7(x64) SP1 简体中文专业版
*     编译器:  Visual Studio 2010 SP1(中文旗舰版)
                MinGW 2011118
                Visual C++ 6.0 SP6(中文企业版)
- ==========================================================*/

#ifndef stringEx_DLL_ForAPI
#define stringEx_DLL_ForAPI

#define stringEx_DLL_API _declspec(dllexport)

#endif

//#include "../../Include/stringEx.h"

//构造函数
TYCppStdLib::stringEx::stringEx()
{
    m_strEx="";
}

TYCppStdLib::stringEx::stringEx(string str)
{
    m_strEx=str;
	//m_strEx.assign(str);
	*this=m_strEx;
}

TYCppStdLib::stringEx::stringEx(const char *str ):string(str)
{
    m_strEx=*this;
}

TYCppStdLib::stringEx::stringEx(
	size_type length, 
	char ch
	):string(length, ch)
{
    m_strEx=*this;
}

TYCppStdLib::stringEx::stringEx(
	const char *str, 
	size_type length
	):string(str, length)
{
    m_strEx=*this;
}

TYCppStdLib::stringEx::stringEx(
	string &str, 
	size_type index, 
	size_type length
	):string(str, index, length)
{
    m_strEx=*this;
}

TYCppStdLib::stringEx::stringEx(
	const_iterator start, 
	const_iterator end
	):string(start, end)
{
    m_strEx=*this;
}

//虚析构函数
TYCppStdLib::stringEx::~stringEx()
{
    //空函数
}

//同步对象本身和m_strEx的值
void TYCppStdLib::stringEx::Synchronous(bool positive)
{
    if(true==positive)
        m_strEx=*this;
	else
	    *this=m_strEx;
}

//获取m_strEx
string TYCppStdLib::stringEx::GetString()
{
    string getString=m_strEx;
	return getString;
}

void TYCppStdLib::stringEx::GetString(string &getString)
{
    getString=m_strEx;
	//getString.assign(m_strEx);
}

//设置m_strEx
void TYCppStdLib::stringEx::SetString(string setString)
{
    m_strEx=setString;
	//m_strEx.assign(setString);
	Synchronous(false);
}

//判断字符串是不是数字
bool TYCppStdLib::stringEx::IsNumeric()
{
    if(""==m_strEx)
	    return false;
	char chTemp;
	for(unsigned int i=0; i < m_strEx.length(); i++ )    
	{
		strcpy(&chTemp,m_strEx.substr(i,1).c_str());
		if(!IsDigitInline(&chTemp))
			return false;
	}
	return true;
}

bool TYCppStdLib::stringEx::IsNumeric(string stString)
{
    if(""==stString)
	    return false;
	char chTemp;
	for(unsigned int i=0; i < stString.length(); i++ )    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		if(!IsDigitInline(&chTemp))
			return false;
	}
	return true;
}

bool TYCppStdLib::stringEx::IsNumeric(string *stString)
{
    if(""==(*stString))
	    return false;
	char chTemp;
	for(unsigned int i=0; i < stString->length(); i++ )    
	{
		strcpy(&chTemp,stString->substr(i,1).c_str());
		if(!IsDigitInline(&chTemp))
			return false;
	}
	return true;
}

/* bool TYCppStdLib::stringEx::IsNumeric(string &stString)
{
    if(""==stString)
	    return false;
	char chTemp;
	for(unsigned int i=0; i < stString.length(); i++ )    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		if(!IsDigitInline(&chTemp))
			return false;
	}
	return true;
} */

//字符串中所有字母转为大写形式
string TYCppStdLib::stringEx::Upcase(bool UpMe)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<m_strEx.size(); i++)    
	{
		strcpy(&chTemp,m_strEx.substr(i,1).c_str());
		stTemp += CharToUpperInline(chTemp);   
	}
	if(true==UpMe)
	{
	    m_strEx=stTemp;
		Synchronous(false);
	}
	return stTemp;
}

string TYCppStdLib::stringEx::Upcase(string stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString.size(); i++)    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		stTemp += CharToUpperInline(chTemp);   
	}
	return stTemp;
}

void TYCppStdLib::stringEx::Upcase(string *stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString->size(); i++)    
	{
		strcpy(&chTemp,stString->substr(i,1).c_str());
		stTemp += CharToUpperInline(chTemp);   
	}
	*stString=stTemp;
}

/* void TYCppStdLib::stringEx::Upcase(string &stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString.size(); i++)    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		stTemp += CharToUpperInline(chTemp);   
	}
	stString=stTemp;
} */

//字符串中所有字母转为小写形式
string TYCppStdLib::stringEx::Lowercase(bool LowMe)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<m_strEx.size(); i++)    
	{
		strcpy(&chTemp,m_strEx.substr(i,1).c_str());
		stTemp += CharToLowerInline(chTemp);   
	}
	if(true==LowMe)
	{
	    m_strEx=stTemp;
		Synchronous(false);
	}
	return stTemp;
}

string TYCppStdLib::stringEx::Lowercase(string stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString.size(); i++)    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		stTemp += CharToLowerInline(chTemp);   
	}
	return stTemp;
}

void TYCppStdLib::stringEx::Lowercase(string *stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString->size(); i++)    
	{
		strcpy(&chTemp,stString->substr(i,1).c_str());
		stTemp += CharToLowerInline(chTemp);   
	}
	*stString=stTemp;
}

/* void TYCppStdLib::stringEx::Lowercase(string &stString)
{
	string stTemp = "";				
	char chTemp;				
	for(unsigned int i=0; i<stString.size(); i++)    
	{
		strcpy(&chTemp,stString.substr(i,1).c_str());
		stTemp += CharToLowerInline(chTemp);   
	}
	stString=stTemp;
} */

//去掉左边指定字符串
string TYCppStdLib::stringEx::LTrim(bool LTrMe, string LTrStr)
{
	string stTemp=m_strEx;
	if (!stTemp.length()) 
	    return stTemp;
	int i=0;	
	string buf;
	while (stTemp.substr(i,1) == LTrStr)
		i++;
	if(0==i)
	    return stTemp;
	if (i == stTemp.length())
	{
		stTemp = "";
		return stTemp;
	}
    stTemp = stTemp.substr(i,stTemp.length()-i);
	if(true==LTrMe)
	{
	    m_strEx=stTemp;
		Synchronous(false);
	}
	return stTemp;
}

string TYCppStdLib::stringEx::LTrim(string stString, string LTrStr)
{
	string stTemp=stString;
	if (!stTemp.length()) 
	    return stTemp;
	int i=0;	
	string buf;
	while (stTemp.substr(i,1) == LTrStr)
		i++;
	if(0==i)
	    return stTemp;
	if (i == stTemp.length())
	{
		stTemp = "";
		return stTemp;
	}
    stTemp = stTemp.substr(i,stTemp.length()-i);
	return stTemp;
}

void TYCppStdLib::stringEx::LTrim(string *stString, string LTrStr)
{
	if (!stString->length()) 
	    return;
	int i=0;	
	string buf;
	while (stString->substr(i,1) == LTrStr)
		i++;
	if(0==i)
	    return;
	if (i == stString->length())
	{
		*stString = "";
		return;
	}
    *stString = stString->substr(i,stString->length()-i);
}

/* void TYCppStdLib::stringEx::LTrim(string &stString, string LTrStr)
{
	if (!stString.length()) 
	    return;
	int i=0;	
	string buf;
	while (stString.substr(i,1) == LTrStr)
		i++;
	if(0==i)
	    return;
	if (i == stString.length())
	{
		stString = "";
		return;
	}
    stString = stString.substr(i,stString.length()-i);
} */

//去掉右边指定字符串
string TYCppStdLib::stringEx::RTrim(bool RTrMe, string RTrStr)
{
    string stTemp=m_strEx;
	if (!stTemp.length())
		return stTemp;
    int i;
	i = stTemp.length()-1;
	while (stTemp.substr(i,1) == RTrStr)
	{
		stTemp = stTemp.substr(0, i);	
		i--;
	}
	if(true==RTrMe)
	{
	    m_strEx=stTemp;
		Synchronous(false);
	}
	return stTemp;
}

string TYCppStdLib::stringEx::RTrim(string stString, string RTrStr)
{
    string stTemp=stString;
	if (!stTemp.length())
		return stTemp;
    int i;
	i = stTemp.length()-1;
	while (stTemp.substr(i,1) == RTrStr)
	{
		stTemp = stTemp.substr(0, i);	
		i--;
	}
	return stTemp;
}

void TYCppStdLib::stringEx::RTrim(string *stString, string RTrStr)
{
	if (!stString->length())
		return;
    int i;
	i = stString->length()-1;
	while (stString->substr(i,1) == RTrStr)
	{
		*stString = stString->substr(0, i);	
		i--;
	}
}

/* void TYCppStdLib::stringEx::RTrim(string &stString, string RTrStr)
{
	if (!stString.length())
		return;
    int i;
	i = stString.length()-1;
	while (stString.substr(i,1) == RTrStr)
	{
		stString = stString.substr(0, i);	
		i--;
	}
} */

//去掉两边指定字符串
string TYCppStdLib::stringEx::Trim(bool TrMe, string TrStr)
{
	string stTemp=m_strEx;
	stTemp=RTrim(stTemp, TrStr);
	if (stTemp.length())
	stTemp=LTrim(stTemp, TrStr);
	if(true==TrMe)
	{
		m_strEx=stTemp;
		Synchronous(false);
	}
	return stTemp;
}

string TYCppStdLib::stringEx::Trim(string stString, string TrStr)
{
	string stTemp=stString;
	stTemp=RTrim(stTemp, TrStr);
	if (stTemp.length())
	stTemp=LTrim(stTemp, TrStr);
	return stTemp;
}

void TYCppStdLib::stringEx::Trim(string *stString, string TrStr)
{
	RTrim(stString, TrStr);
	if (stString->length())
	LTrim(stString, TrStr);
}

/* void TYCppStdLib::stringEx::Trim(string &stString, string TrStr)
{
	RTrim(stString, TrStr);
	if (stString.length())
		LTrim(stString, TrStr);
} */


转载于:https://my.oschina.net/u/186539/blog/56582

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值