怎么 STD::string 这么不好用???? std::string 没有 不区分大小写比较, 也就算了, 但是, 他怎么联个 trim 的功能都没有提供呢? 根CString 差远了, 他的优势再那里 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以用下面的方法把string转换成CString:string STDstr;CString MFCstr;MFCstr = STDstr.c_str(); string是basic_string的一个特化,而basic_string的定性是:变长序列容器,且其元素必须不依赖显式的构造或析构函数。其实字符串的原始本质是:变长的字符序列。string是很符合这个原始本质的。而区分大小写,trimspace之类的已经超出这个原始本质。CString之所以比string方便,是因为它是比string更上层的一种应用,CString所关心的字符串已经超出了"变长的字符序列"这个范畴,而把字符串看作一种有大小写,有空格的东西。 如果需要,可以写一个类继承 std::string 以下是我重载的头文件// XString.h: interface for the XString class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_XSTRING_H__F39C99AD_76D0_4BD6_946D_3FFF05F3145F__INCLUDED_)#define AFX_XSTRING_H__F39C99AD_76D0_4BD6_946D_3FFF05F3145F__INCLUDED_#include <stdio.h>#include <stdarg.h>#include <cassert>#include <algorithm>#include <string>#include <tchar.h>//#include "TemplateList.h"#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define _CS(x) LPCTSTR(x)class XStringList;#ifdef _UNICODE#define tstring std::wstring#else#define tstring std::string#endifclass XString : public tstring{public: int Delete(int nIndex, int nCount = 1); int Insert(int nIndex, LPCTSTR pstr); int Insert(int nIndex, TCHAR ch); int Remove(TCHAR ch); void MakeReverse(); int Find(TCHAR ch) const; int Find(LPCTSTR lpszSub) const; int Find(TCHAR ch, int nStart) const; int Find(LPCTSTR pstr, int nStart) const; int ReverseFind(TCHAR ch) const; int FindOneOf(LPCTSTR lpszCharSet) const; int Format(LPCTSTR pstrFormat, ...); int FormatA(LPCTSTR pstrFormat, va_list argList); int GetLength() const; int GetBufferSize() const; XString Left(int nCount) const; XString Right(int nCount) const; XString Mid(int nFirst) const; XString Mid(int nFirst, int nCount) const; XString& operator = (const XString& str); XString& operator = (const tstring str); XString& operator = (TCHAR ch); XString& operator = (LPCTSTR pstr); void MakeUpper(); void MakeLower(); bool IsEmpty() const; void Empty(); TCHAR GetAt(int nIndex) const; TCHAR operator [](int nIndex) const; void SetAt(int nIndex, TCHAR ch); operator LPCTSTR () const; operator LPTSTR (); friend XString operator + (const XString& string1, const XString& string2); friend XString operator + (const XString& string1, TCHAR ch); friend XString operator + (const XString& string1, LPTSTR ch); friend XString operator + (const XString& string1, LPCTSTR pstr); int Compare(LPCTSTR pstr) const; int Compare(const XString& string1) const; int CompareNoCase(LPCTSTR pstr) const; int CompareNoCase(const XString& string1) const; void Trim(); void TrimLeft(); void TrimRight(); void Trim(TCHAR chTarget); void TrimLeft(TCHAR chTarget); void TrimRight(TCHAR chTarget); void Replace(TCHAR chOld, TCHAR chNew); void Replace(LPCTSTR chOld, LPCTSTR chNew); LPTSTR GetBuffer(int nMinBufLength); void ReleaseBuffer(int nNewLength = -1); XString(const XString& string1); XString(LPCTSTR pstr); XString(const TCHAR ch); XString(); static int strToArglist(LPCTSTR pszStr, LPCTSTR pszToken, XStringList & arglist);};/*class XStringList : public TemplateList<XString*>{public: ~XStringList() { Clear(); } void Clear() { Lock(); for (XStringList::iterator it = begin(); it != end(); it++) { XString * pString = (XString*)*it; if (pString) delete pString; } clear(); Unlock(); }};*/#endif // !defined(AFX_XSTRING_H__F39C99AD_76D0_4BD6_946D_3FFF05F3145F__INCLUDED_) 以下是实现,分两部分// XString.cpp: implementation of the XString class.////////////////////////////////////////////////////////////////////////#include "XString.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////int XString::Delete(int nIndex, int nCount){ this->erase(nIndex,nCount); return this->GetLength();}int XString::Insert(int nIndex, LPCTSTR pstr){ XString stmp = pstr; this->insert(nIndex,stmp); return this->GetLength();}int XString::Insert(int nIndex, TCHAR ch){ XString strTmp(ch); this->insert(nIndex,strTmp); strTmp.Empty(); return this->GetLength();}int XString::Remove(TCHAR ch){ XString::iterator iter; int count = 0; for(iter = this->begin(); iter != this->end();iter ++) { if(*iter == ch) { this->erase(iter);count++; } } return count;}void XString::MakeReverse(){ XString strTmp; XString::iterator iter; iter=this->end(); iter--; for(; iter != this->begin(); iter--) { strTmp += *iter; } strTmp += *iter; *this = strTmp; strTmp.Empty();}int XString::Find(TCHAR ch) const{ return this->find(ch);}int XString::Find(LPCTSTR lpszSub) const{ return this->find(lpszSub);}int XString::Find(TCHAR ch, int nStart) const{ return this->find(ch,nStart);}int XString::Find(LPCTSTR pstr, int nStart) const{ return this->find(pstr,nStart);}int XString::ReverseFind(TCHAR ch) const{ return this->find_last_of(ch);}int XString::FindOneOf(LPCTSTR lpszCharSet) const{ return this->find_first_of(lpszCharSet);}int XString::Format(LPCTSTR pstrFormat, ...){///本函数仅仅支持ANSI标准字符集 '%[flags] [width] [.precision] [{h | l | I64 | L}]type' assert(pstrFormat!=NULL); int nMaxLen = 0; va_list argList; va_start(argList, pstrFormat); // 重新开始提取参数 //vsprintf(GetBuffer(nMaxLen), pstrFormat, argList); nMaxLen = FormatA(pstrFormat,argList); va_end(argList); return nMaxLen;}int XString::FormatA(LPCTSTR pstrFormat, va_list argList){ ///本函数仅仅支持ANSI标准字符集 '%[flags] [width] [.precision] [{h | l | I64 | L}]type' assert(pstrFormat!=NULL); int nMaxLen = 0; va_list argListSave = argList; //va_start(argList,pstrFormat); for (LPCTSTR p = pstrFormat; *p != '\0';p++) { if (*p != '%' || *(++p) == '%') {// 如果不是'%'就直接累计长度,如果是'%%'也使长度加1 nMaxLen += 1; continue; } int nItemLen = 0; //用来保存每个参数的长度 int nWidth = 0; //用来保存每一项的宽度 bool b64 = false; for (; *p != '\0'; p ++) { if (*p == '#') nMaxLen += 2; // 处理 '0x' else if (*p == '*') nWidth = va_arg(argList, int); //如:'%5f' 中的5 else if (*p == '-' || *p == '+' || *p == '0'|| *p == ' ') ; //忽略该符号 else // 不是标志字符就退出循环 break; } if (nWidth == 0) { //提取宽度 nWidth = ::_ttoi(p); for (; *p != '\0' && isdigit(*p); p ++) ; } assert(nWidth >= 0);//有效宽度 int nPrecision = 0; //精度位数 if (*p == '.') { p++;// 跳过 '.'字符 (宽度.精度) if (*p == '*') { //有参数给出 nPrecision = va_arg(argList, int); p ++;// 取得精度,跳过字符 } else { //在格式串中有宽度 nPrecision = _ttoi(p); for (; *p != '\0' && isdigit(*p); p ++) ; } assert(nPrecision >= 0);//有效宽度 } if (_tcsncmp(p, _T("I64"), 3) == 0) { p += 3; b64 = true; } else { switch (*p) { case 'h': //short int 型 p ++; break; case 'l': //long double 型 p ++; break; case 'F': //近指针 case 'N': //远指针 case 'L': //long double 型 p++; break; } } switch (*p) { case 'c': //// 单个字符 case 'C': nItemLen = 2; va_arg(argList, TCHAR); break; case 's': //// 字符串 case 'S': nItemLen = _tcslen(va_arg(argList, LPCTSTR)); nItemLen = ((1) > (nItemLen)) ? (1) : (nItemLen);//如果是空串就使用1 即保存'\0' break; } if (nItemLen != 0) { nItemLen = ((nItemLen) > (nWidth)) ? (nItemLen) : (nWidth);//使用大者 if (nPrecision != 0) nItemLen = ((nItemLen) < (nPrecision)) ? (nItemLen) : (nPrecision); } else { switch (*p) { case 'd': //整数的处理 case 'i': case 'u': case 'x': case 'X': case 'o': if (b64) va_arg(argList, __int64); else va_arg(argList, int); nItemLen = 32; //四字节 nItemLen = ((nItemLen) > (nWidth+nPrecision)) ? (nItemLen) : (nWidth+nPrecision);//使用大者 break; case 'e': //浮点数 case 'f': case 'g': case _T('G'): va_arg(argList, double); nItemLen = 32;//四字节 nItemLen = ((nItemLen) > (nWidth+nPrecision)) ? (nItemLen) : (nWidth+nPrecision);//使用大者; break; case 'p': //指针 va_arg(argList, void*); nItemLen = 32; nItemLen = ((nItemLen) > (nWidth+nPrecision)) ? (nItemLen) : (nWidth+nPrecision);//使用大者; break; case 'n': va_arg(argList, int*); //指向整数的指针 break; default: assert(false); //不能处理的格式,给出警告 } } nMaxLen += nItemLen;//把该项的长度累计 } //va_end(argList); //va_start(argList, pstrFormat); // 重新开始提取参数 XString strTmp; _vstprintf(strTmp.GetBuffer(nMaxLen), pstrFormat, argListSave); *this = _CS(strTmp); va_end(argListSave); return nMaxLen;}int XString::GetLength() const{ return ::_tcslen(this->c_str());}int XString::GetBufferSize() const{ return this->length();}XString XString::Left(int nCount) const{ if (nCount <= 0) return XString(_T("")); XString strTmp; strTmp = this->substr(0,nCount); return strTmp;}XString XString::Right(int nCount) const{ if (nCount <= 0) return XString(_T("")); XString strTmp; if (nCount > GetLength()) strTmp = this->substr(0); else strTmp = this->substr(GetLength()-nCount); return strTmp;}XString XString::Mid(int nFirst) const{ XString strTmp; if (nFirst >= GetLength()) return XString(_T("")); if (nFirst <= 0) strTmp = this->substr(0); else strTmp = this->substr(nFirst); return strTmp;} XString XString::Mid(int nFirst, int nCount) const{ if (nCount <= 0) return XString(_T("")); if (nFirst >= GetLength()) return XString(_T("")); XString strTmp; if (nFirst <= 0) strTmp = this->substr(0,nCount); else strTmp = this->substr(nFirst,nCount); return strTmp;}XString& XString::operator = (const XString& str){ if (str.c_str() != c_str()) { this->Empty(); this->append(str); } return *this;}XString& XString::operator = (const tstring str){ if (this->compare(str) == 0) return *this; this->assign(str); return *this;}XString& XString::operator = (TCHAR ch){ this->Empty(); this->insert(this->begin(),ch); return *this;}XString& XString::operator = (LPCTSTR pstr){ if (pstr != NULL && pstr != c_str()) { this->Empty(); this->append(pstr); } return *this;}void XString::MakeUpper(){ std::transform(this->begin (), this->end (),this->begin (), toupper);}void XString::MakeLower(){ std::transform(this->begin(),this->end(),this->begin(),tolower);}bool XString::IsEmpty() const{ return this->empty();}void XString::Empty(){//清除 this->erase(this->begin(),this->end());}TCHAR XString::GetAt(int nIndex) const{ return this->at(nIndex);}TCHAR XString::operator [](int nIndex) const{ return this->at(nIndex);}void XString::SetAt(int nIndex, TCHAR ch){ this->at(nIndex) = ch;}XString::operator LPCTSTR () const{ return this->c_str();}XString::operator LPTSTR (){ return (LPTSTR)this->c_str();}XString operator + (const XString& string1, const XString& string2){ XString str; str.append(string1); str.append(string2); return str;}XString operator + (const XString& string1, TCHAR ch){ XString str; str.append(string1); str.insert(str.end(),ch); return str;}XString operator + (const XString& string1, LPTSTR ch){ XString str; str.append(string1); if (ch != NULL) str.append(ch); return str;}XString operator + (const XString& string1, LPCTSTR pstr){ XString str; str.append(string1); if (pstr != NULL) { str.append(pstr); } return str;}int XString::Compare(LPCTSTR pstr) const{ XString str; if (pstr != NULL) str.append(pstr); return this->compare(str);}int XString::Compare(const XString& string1) const{ return this->compare(string1);}int XString::CompareNoCase(LPCTSTR pstr) const{ XString str,strThis; if (pstr != NULL) str.append(pstr); strThis = (*this); str.MakeLower(); strThis.MakeLower(); return strThis.compare(str);}int XString::CompareNoCase(const XString& string1) const{ XString str,strThis; str = string1; strThis = (*this); str.MakeLower(); strThis.MakeLower(); return strThis.compare(str);}void XString::Trim(){ TrimLeft(' '); TrimRight(' ');}void XString::TrimLeft(){ TrimLeft(' ');}void XString::TrimRight(){ TrimRight(' ');}void XString::Trim(TCHAR chTarget){ TrimLeft(chTarget); TrimRight(chTarget);}void XString::TrimLeft(TCHAR chTarget){ tstring::size_type pos; pos = this->find_first_not_of(chTarget); if (pos == 0) return; this->erase(this->begin(),this->begin()+pos);}void XString::TrimRight(TCHAR chTarget){ tstring::size_type pos; pos = this->find_last_not_of(chTarget); ++pos; if (pos == this->GetLength()) return; this->erase(this->begin()+pos,this->end());}void XString::Replace(TCHAR chOld, TCHAR chNew){ for (int i=0;i<this->GetLength();i++) { if (this->at(i) == chOld) this->at(i) = chNew; }}void XString::Replace(LPCTSTR chOld, LPCTSTR chNew){ if (chOld != NULL && chNew != NULL) { int index = this->find(chOld); while (index > -1) { this->erase(index,_tcslen(chOld)); this->insert(index,chNew); index = this->find(chOld); } }}LPTSTR XString::GetBuffer(int nMinBufLength){ this->resize(nMinBufLength); return (LPTSTR)this->c_str();}void XString::ReleaseBuffer(int nNewLength){ this->TrimRight('\0');}XString::XString(const XString& string1){ this->append(string1);}XString::XString(LPCTSTR pstr){ if (pstr != NULL) this->append(pstr);}XString::XString(const TCHAR ch){ *this += ch;}XString::XString(){}int XString::strToArglist(LPCTSTR pszStr, LPCTSTR pszToken, XStringList & arglist){ int tok_len = ::_tcslen(pszToken); int str_len = ::_tcslen(pszStr); LPTSTR tToken = new TCHAR[tok_len + 1]; LPTSTR tStr = new TCHAR[str_len + 1]; LPTSTR tmp = new TCHAR[str_len + 1]; LPTSTR p1 = tStr; LPTSTR p2 = tStr; ::ZeroMemory(tToken,tok_len + 1); ::ZeroMemory(tStr,str_len + 1); ::CopyMemory(tStr,pszStr,str_len); bool bToken = false; do { ::ZeroMemory(tmp,str_len + 1); p2 = ::_tcsstr(p1,pszToken); if (p1 == p2) { } if ((p2 != NULL && p1 == tStr) || *p1 != 0x00 || (p2 == NULL && bToken && *p1 == 0x00)) { if (p2 == NULL) ::CopyMemory(tmp,p1,::_tcslen(p1)); else ::CopyMemory(tmp,p1,p2-p1); XString * pstr = new XString; *pstr = tmp; arglist.PushItem(pstr); bToken = true; }/* else if (p2 == NULL && bToken && *p1 == 0x00) { XString * pstr = new XString; arglist.PushItem(pstr); }*/ if (p2 != NULL) p1 = p2 + tok_len; } while(p2 != NULL); delete [] tToken; delete [] tStr; delete [] tmp; return arglist.Size();} 回楼上的:aa3000(杀手K) 我在VC6.0里包含你的代码的头文件,包含时没有错,但只要定义一个变量就出错,如: 定义变量如下:XString m_MyXString;编译就出下面的错: error LNK2001: unresolved external symbol "public: __thiscall XString::XString(void)" (??0XString@@QAE@XZ) 不明白什么原因,请楼上的帮忙解释一下,谢谢!!!!!!!!!!!!! aa3000(杀手K) , 厉害, 学习 Bitmap Button 不可用的情况 关于用户界面线程的问题求教高手,万分感谢!!! 在基于对话框的MFC程序中,怎样用picture control 动态的显示位图? MFC DLL 200分请教关于窗口镜像的问题 《程序员》2001年刊中出现过一个软件:StopWatch,谁知道哪里可以下载到? 调试状态下程序运行正常,结束前却出现“未处理的异常:用户断点”,停留在mlock.c里面的_unlock函数的后括号处。 编译时出错,!!急!!! CObArray问题 程序员啊!(转载) [求助]如何用VC实现Email的附件收,发 高分征名 系列3
string STDstr;
CString MFCstr;
MFCstr = STDstr.c_str();
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_XSTRING_H__F39C99AD_76D0_4BD6_946D_3FFF05F3145F__INCLUDED_)
#define AFX_XSTRING_H__F39C99AD_76D0_4BD6_946D_3FFF05F3145F__INCLUDED_#include <stdio.h>
#include <stdarg.h>
#include <cassert>
#include <algorithm>
#include <string>
#include <tchar.h>
//#include "TemplateList.h"#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#define _CS(x) LPCTSTR(x)class XStringList;#ifdef _UNICODE
#define tstring std::wstring
#else
#define tstring std::string
#endifclass XString : public tstring
{
public: int Delete(int nIndex, int nCount = 1);
int Insert(int nIndex, LPCTSTR pstr);
int Insert(int nIndex, TCHAR ch);
int Remove(TCHAR ch);
void MakeReverse();
int Find(TCHAR ch) const;
int Find(LPCTSTR lpszSub) const;
int Find(TCHAR ch, int nStart) const;
int Find(LPCTSTR pstr, int nStart) const;
int ReverseFind(TCHAR ch) const;
int FindOneOf(LPCTSTR lpszCharSet) const;
int Format(LPCTSTR pstrFormat, ...);
int FormatA(LPCTSTR pstrFormat, va_list argList);
int GetLength() const;
int GetBufferSize() const;
XString Left(int nCount) const;
XString Right(int nCount) const;
XString Mid(int nFirst) const;
XString Mid(int nFirst, int nCount) const;
XString& operator = (const XString& str);
XString& operator = (const tstring str);
XString& operator = (TCHAR ch);
XString& operator = (LPCTSTR pstr);
void MakeUpper();
void MakeLower();
bool IsEmpty() const;
void Empty();
TCHAR GetAt(int nIndex) const;
TCHAR operator [](int nIndex) const;
void SetAt(int nIndex, TCHAR ch);
operator LPCTSTR () const;
operator LPTSTR ();
friend XString operator + (const XString& string1, const XString& string2);
friend XString operator + (const XString& string1, TCHAR ch);
friend XString operator + (const XString& string1, LPTSTR ch);
friend XString operator + (const XString& string1, LPCTSTR pstr);
int Compare(LPCTSTR pstr) const;
int Compare(const XString& string1) const;
int CompareNoCase(LPCTSTR pstr) const;
int CompareNoCase(const XString& string1) const;
void Trim();
void TrimLeft();
void TrimRight();
void Trim(TCHAR chTarget);
void TrimLeft(TCHAR chTarget);
void TrimRight(TCHAR chTarget);
void Replace(TCHAR chOld, TCHAR chNew);
void Replace(LPCTSTR chOld, LPCTSTR chNew);
LPTSTR GetBuffer(int nMinBufLength);
void ReleaseBuffer(int nNewLength = -1);
XString(const XString& string1);
XString(LPCTSTR pstr);
XString(const TCHAR ch);
XString();
static int strToArglist(LPCTSTR pszStr, LPCTSTR pszToken, XStringList & arglist);};/*
class XStringList : public TemplateList<XString*>
{
public:
~XStringList()
{
Clear();
}
void Clear()
{
Lock();
for (XStringList::iterator it = begin(); it != end(); it++)
{
XString * pString = (XString*)*it;
if (pString)
delete pString;
}
clear();
Unlock();
}
};
*/
#endif // !defined(AFX_XSTRING_H__F39C99AD_76D0_4BD6_946D_3FFF05F3145F__INCLUDED_)
//
//////////////////////////////////////////////////////////////////////#include "XString.h"//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
int XString::Delete(int nIndex, int nCount)
{
this->erase(nIndex,nCount);
return this->GetLength();
}int XString::Insert(int nIndex, LPCTSTR pstr)
{
XString stmp = pstr;
this->insert(nIndex,stmp);
return this->GetLength();
}int XString::Insert(int nIndex, TCHAR ch)
{
XString strTmp(ch);
this->insert(nIndex,strTmp);
strTmp.Empty();
return this->GetLength();
}int XString::Remove(TCHAR ch)
{
XString::iterator iter;
int count = 0;
for(iter = this->begin(); iter != this->end();iter ++)
{
if(*iter == ch)
{
this->erase(iter);count++;
}
}
return count;
}void XString::MakeReverse()
{
XString strTmp;
XString::iterator iter;
iter=this->end();
iter--;
for(; iter != this->begin(); iter--)
{
strTmp += *iter;
}
strTmp += *iter;
*this = strTmp;
strTmp.Empty();
}int XString::Find(TCHAR ch) const
{
return this->find(ch);
}int XString::Find(LPCTSTR lpszSub) const
{
return this->find(lpszSub);
}int XString::Find(TCHAR ch, int nStart) const
{
return this->find(ch,nStart);
}int XString::Find(LPCTSTR pstr, int nStart) const
{
return this->find(pstr,nStart);
}int XString::ReverseFind(TCHAR ch) const
{
return this->find_last_of(ch);
}int XString::FindOneOf(LPCTSTR lpszCharSet) const
{
return this->find_first_of(lpszCharSet);
}int XString::Format(LPCTSTR pstrFormat, ...)
{
///本函数仅仅支持ANSI标准字符集 '%[flags] [width] [.precision] [{h | l | I64 | L}]type'
assert(pstrFormat!=NULL);
int nMaxLen = 0;
va_list argList;
va_start(argList, pstrFormat); // 重新开始提取参数
//vsprintf(GetBuffer(nMaxLen), pstrFormat, argList);
nMaxLen = FormatA(pstrFormat,argList);
va_end(argList);
return nMaxLen;
}int XString::FormatA(LPCTSTR pstrFormat, va_list argList)
{
///本函数仅仅支持ANSI标准字符集 '%[flags] [width] [.precision] [{h | l | I64 | L}]type'
assert(pstrFormat!=NULL);
int nMaxLen = 0;
va_list argListSave = argList;
//va_start(argList,pstrFormat);
for (LPCTSTR p = pstrFormat; *p != '\0';p++)
{
if (*p != '%' || *(++p) == '%')
{// 如果不是'%'就直接累计长度,如果是'%%'也使长度加1
nMaxLen += 1;
continue;
}
int nItemLen = 0; //用来保存每个参数的长度
int nWidth = 0; //用来保存每一项的宽度
bool b64 = false;
for (; *p != '\0'; p ++)
{
if (*p == '#')
nMaxLen += 2; // 处理 '0x'
else if (*p == '*')
nWidth = va_arg(argList, int); //如:'%5f' 中的5
else if (*p == '-' || *p == '+' || *p == '0'|| *p == ' ')
; //忽略该符号
else // 不是标志字符就退出循环
break;
}
if (nWidth == 0)
{ //提取宽度
nWidth = ::_ttoi(p);
for (; *p != '\0' && isdigit(*p); p ++)
;
}
assert(nWidth >= 0);//有效宽度
int nPrecision = 0; //精度位数
if (*p == '.')
{
p++;// 跳过 '.'字符 (宽度.精度)
if (*p == '*')
{ //有参数给出
nPrecision = va_arg(argList, int);
p ++;// 取得精度,跳过字符
}
else
{ //在格式串中有宽度
nPrecision = _ttoi(p);
for (; *p != '\0' && isdigit(*p); p ++)
;
}
assert(nPrecision >= 0);//有效宽度
}
if (_tcsncmp(p, _T("I64"), 3) == 0)
{
p += 3;
b64 = true;
} else {
switch (*p)
{
case 'h': //short int 型
p ++;
break;
case 'l': //long double 型
p ++;
break;
case 'F': //近指针
case 'N': //远指针
case 'L': //long double 型
p++;
break;
}
}
switch (*p)
{
case 'c': //// 单个字符
case 'C':
nItemLen = 2;
va_arg(argList, TCHAR);
break;
case 's': //// 字符串
case 'S':
nItemLen = _tcslen(va_arg(argList, LPCTSTR));
nItemLen = ((1) > (nItemLen)) ? (1) : (nItemLen);//如果是空串就使用1 即保存'\0'
break;
}
if (nItemLen != 0)
{
nItemLen = ((nItemLen) > (nWidth)) ? (nItemLen) : (nWidth);//使用大者
if (nPrecision != 0)
nItemLen = ((nItemLen) < (nPrecision)) ? (nItemLen) : (nPrecision);
}
else
{
switch (*p)
{
case 'd': //整数的处理
case 'i':
case 'u':
case 'x':
case 'X':
case 'o':
if (b64)
va_arg(argList, __int64);
else
va_arg(argList, int);
nItemLen = 32; //四字节
nItemLen = ((nItemLen) > (nWidth+nPrecision)) ? (nItemLen) : (nWidth+nPrecision);//使用大者
break;
case 'e': //浮点数
case 'f':
case 'g':
case _T('G'):
va_arg(argList, double);
nItemLen = 32;//四字节
nItemLen = ((nItemLen) > (nWidth+nPrecision)) ? (nItemLen) : (nWidth+nPrecision);//使用大者;
break;
case 'p': //指针
va_arg(argList, void*);
nItemLen = 32;
nItemLen = ((nItemLen) > (nWidth+nPrecision)) ? (nItemLen) : (nWidth+nPrecision);//使用大者;
break;
case 'n':
va_arg(argList, int*); //指向整数的指针
break;
default:
assert(false); //不能处理的格式,给出警告
}
}
nMaxLen += nItemLen;//把该项的长度累计
}
//va_end(argList);
//va_start(argList, pstrFormat); // 重新开始提取参数
XString strTmp;
_vstprintf(strTmp.GetBuffer(nMaxLen), pstrFormat, argListSave);
*this = _CS(strTmp);
va_end(argListSave);
return nMaxLen;
}int XString::GetLength() const
{
return ::_tcslen(this->c_str());
}int XString::GetBufferSize() const
{
return this->length();
}XString XString::Left(int nCount) const
{
if (nCount <= 0)
return XString(_T(""));
XString strTmp;
strTmp = this->substr(0,nCount);
return strTmp;
}XString XString::Right(int nCount) const
{
if (nCount <= 0)
return XString(_T(""));
XString strTmp;
if (nCount > GetLength())
strTmp = this->substr(0);
else
strTmp = this->substr(GetLength()-nCount);
return strTmp;
}XString XString::Mid(int nFirst) const
{
XString strTmp;
if (nFirst >= GetLength())
return XString(_T(""));
if (nFirst <= 0)
strTmp = this->substr(0);
else
strTmp = this->substr(nFirst);
return strTmp;
}
XString XString::Mid(int nFirst, int nCount) const
{
if (nCount <= 0)
return XString(_T(""));
if (nFirst >= GetLength())
return XString(_T(""));
XString strTmp;
if (nFirst <= 0)
strTmp = this->substr(0,nCount);
else
strTmp = this->substr(nFirst,nCount);
return strTmp;
}XString& XString::operator = (const XString& str)
{
if (str.c_str() != c_str())
{
this->Empty();
this->append(str);
}
return *this;
}XString& XString::operator = (const tstring str)
{
if (this->compare(str) == 0) return *this;
this->assign(str);
return *this;
}XString& XString::operator = (TCHAR ch)
{
this->Empty();
this->insert(this->begin(),ch);
return *this;
}XString& XString::operator = (LPCTSTR pstr)
{
if (pstr != NULL && pstr != c_str())
{
this->Empty();
this->append(pstr);
}
return *this;
}void XString::MakeUpper()
{
std::transform(this->begin (),
this->end (),this->begin (),
toupper);
}void XString::MakeLower()
{
std::transform(this->begin(),this->end(),this->begin(),tolower);
}bool XString::IsEmpty() const
{
return this->empty();
}void XString::Empty()
{//清除
this->erase(this->begin(),this->end());
}TCHAR XString::GetAt(int nIndex) const
{
return this->at(nIndex);
}TCHAR XString::operator [](int nIndex) const
{
return this->at(nIndex);
}void XString::SetAt(int nIndex, TCHAR ch)
{
this->at(nIndex) = ch;
}XString::operator LPCTSTR () const
{
return this->c_str();
}XString::operator LPTSTR ()
{
return (LPTSTR)this->c_str();
}XString operator + (const XString& string1, const XString& string2)
{
XString str;
str.append(string1);
str.append(string2);
return str;
}XString operator + (const XString& string1, TCHAR ch)
{
XString str;
str.append(string1);
str.insert(str.end(),ch);
return str;
}XString operator + (const XString& string1, LPTSTR ch)
{
XString str;
str.append(string1);
if (ch != NULL)
str.append(ch);
return str;
}XString operator + (const XString& string1, LPCTSTR pstr)
{
XString str;
str.append(string1);
if (pstr != NULL)
{
str.append(pstr);
}
return str;
}int XString::Compare(LPCTSTR pstr) const
{
XString str;
if (pstr != NULL)
str.append(pstr);
return this->compare(str);
}int XString::Compare(const XString& string1) const
{
return this->compare(string1);
}int XString::CompareNoCase(LPCTSTR pstr) const
{
XString str,strThis;
if (pstr != NULL)
str.append(pstr);
strThis = (*this);
str.MakeLower();
strThis.MakeLower();
return strThis.compare(str);
}int XString::CompareNoCase(const XString& string1) const
{
XString str,strThis;
str = string1;
strThis = (*this);
str.MakeLower();
strThis.MakeLower();
return strThis.compare(str);
}void XString::Trim()
{
TrimLeft(' ');
TrimRight(' ');
}void XString::TrimLeft()
{
TrimLeft(' ');
}void XString::TrimRight()
{
TrimRight(' ');
}void XString::Trim(TCHAR chTarget)
{
TrimLeft(chTarget);
TrimRight(chTarget);
}void XString::TrimLeft(TCHAR chTarget)
{
tstring::size_type pos;
pos = this->find_first_not_of(chTarget);
if (pos == 0) return;
this->erase(this->begin(),this->begin()+pos);
}void XString::TrimRight(TCHAR chTarget)
{
tstring::size_type pos;
pos = this->find_last_not_of(chTarget);
++pos;
if (pos == this->GetLength())
return;
this->erase(this->begin()+pos,this->end());
}void XString::Replace(TCHAR chOld, TCHAR chNew)
{
for (int i=0;i<this->GetLength();i++)
{
if (this->at(i) == chOld)
this->at(i) = chNew;
}
}void XString::Replace(LPCTSTR chOld, LPCTSTR chNew)
{
if (chOld != NULL && chNew != NULL)
{
int index = this->find(chOld);
while (index > -1)
{
this->erase(index,_tcslen(chOld));
this->insert(index,chNew);
index = this->find(chOld);
}
}
}LPTSTR XString::GetBuffer(int nMinBufLength)
{
this->resize(nMinBufLength);
return (LPTSTR)this->c_str();
}void XString::ReleaseBuffer(int nNewLength)
{
this->TrimRight('\0');
}XString::XString(const XString& string1)
{
this->append(string1);
}XString::XString(LPCTSTR pstr)
{
if (pstr != NULL)
this->append(pstr);
}XString::XString(const TCHAR ch)
{
*this += ch;
}XString::XString()
{}int XString::strToArglist(LPCTSTR pszStr, LPCTSTR pszToken, XStringList & arglist)
{
int tok_len = ::_tcslen(pszToken);
int str_len = ::_tcslen(pszStr);
LPTSTR tToken = new TCHAR[tok_len + 1];
LPTSTR tStr = new TCHAR[str_len + 1];
LPTSTR tmp = new TCHAR[str_len + 1];
LPTSTR p1 = tStr; LPTSTR p2 = tStr;
::ZeroMemory(tToken,tok_len + 1);
::ZeroMemory(tStr,str_len + 1);
::CopyMemory(tStr,pszStr,str_len);
bool bToken = false; do
{
::ZeroMemory(tmp,str_len + 1);
p2 = ::_tcsstr(p1,pszToken);
if (p1 == p2)
{ } if ((p2 != NULL && p1 == tStr) || *p1 != 0x00 || (p2 == NULL && bToken && *p1 == 0x00))
{
if (p2 == NULL)
::CopyMemory(tmp,p1,::_tcslen(p1));
else
::CopyMemory(tmp,p1,p2-p1);
XString * pstr = new XString;
*pstr = tmp;
arglist.PushItem(pstr); bToken = true;
}/* else if (p2 == NULL && bToken && *p1 == 0x00) {
XString * pstr = new XString;
arglist.PushItem(pstr);
}*/ if (p2 != NULL)
p1 = p2 + tok_len;
}
while(p2 != NULL); delete [] tToken;
delete [] tStr;
delete [] tmp; return arglist.Size();
}
我在VC6.0里包含你的代码的头文件,包含时没有错,但只要定义一个变量就出错,如:
定义变量如下:XString m_MyXString;编译就出下面的错:
error LNK2001: unresolved external symbol "public: __thiscall XString::XString(void)" (??0XString@@QAE@XZ) 不明白什么原因,请楼上的帮忙解释一下,谢谢!!!!!!!!!!!!!