std::string 没有 不区分大小写比较, 也就算了,  但是, 他怎么联个 trim 的功能都没有提供呢? 根CString 差远了, 他的优势再那里

解决方案 »

  1.   

    你可以用下面的方法把string转换成CString:
    string STDstr;
    CString MFCstr;
    MFCstr = STDstr.c_str();
      

  2.   

    string是basic_string的一个特化,而basic_string的定性是:变长序列容器,且其元素必须不依赖显式的构造或析构函数。其实字符串的原始本质是:变长的字符序列。string是很符合这个原始本质的。而区分大小写,trimspace之类的已经超出这个原始本质。CString之所以比string方便,是因为它是比string更上层的一种应用,CString所关心的字符串已经超出了"变长的字符序列"这个范畴,而把字符串看作一种有大小写,有空格的东西。
      

  3.   

    如果需要,可以写一个类继承 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_)
      

  4.   

    以下是实现,分两部分// 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;
    }
      

  5.   


    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();
    }
      

  6.   

    回楼上的:aa3000(杀手K) 
         我在VC6.0里包含你的代码的头文件,包含时没有错,但只要定义一个变量就出错,如:
         定义变量如下:XString m_MyXString;编译就出下面的错:
         error LNK2001: unresolved external symbol "public: __thiscall XString::XString(void)" (??0XString@@QAE@XZ)     不明白什么原因,请楼上的帮忙解释一下,谢谢!!!!!!!!!!!!!
      

  7.   

    aa3000(杀手K)  , 厉害,  学习