//===============================写在前面===============================
在标准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);
} */