string也可以很精彩

来源:互联网 发布:行为审计软件 编辑:程序博客网 时间:2024/04/19 11:23

//========================================================================
//TITLE:
//    string也可以很精彩
//AUTHOR:
//    norains
//DATE:
//    Moday 03-November-2008
//Environment:
//    NONE
//========================================================================
    对于习惯于MFC架构的朋友来说,估计直接采用API方式写代码最痛苦的莫过于没有CString。其实,在STL里面,我们依然还有std::string可用,虽然在某些程度中不及CString便利,但也能勉强聊胜于无了。
   
   
    1.宏定义
   
     在WinCE编程中,我们几乎很少直接使用wchar_t,对于char也是如此。取而代之,我们更倾向于微软的建议:TCHAR----没办法,谁让wince是微软的产品呢?但既然都已经上了这贼船,那么我们不妨也入乡随俗一把,将std::string也做类似的定义吧:
    
     #ifdef UNICODE
      #ifndef TSTRING
       #define TSTRING std::wstring
      #endif
     #else
      #ifndef TSTRING
       #define TSTRING std::string
      #endif
     #endif
    
     带来的另外一个好处是,我们可以少敲打四次键盘。从延长键盘寿命的角度考虑,这也算是一大贡献。好吧,为了我的键盘能够服役得更久一些,接下来的内容,我都会直接采用TSTRING替代。
    
    
    2.初始化
   
    初始化的方式多种多样,一般会有如下:
    TSTRING strA = TEXT("A");
  TSTRING strB(TEXT("B"));
  
  如果和容器打交道,那其实也很简单:
    std::vector<TCHAR> vtC(MAX_PATH,0);
  TSTRING strC(vtC.begin(),vtC.end());
  
  
  3.赋值
  
  初始化简单,赋值也不会差哪里去:
  
  strA = TEXT("A2");

  TCHAR szB[] = TEXT("B2");
  strB = szB;
  
  和容器打交道,同样也是简单:
  strC = &vtC[0];
  
  
  4.追加
  
  让我们回忆一下纯粹用数组的日子,如果想要在一固定的数组后面追加字符串,那么我们首先要分配一个足够大的空间,然后赋值旧的数值,最后再追加新值。也许很多人对下面这段伪代码记忆犹新:
  
  TCHAR *pBuf;
  ...  
  TCHAR *pNew = new TCHAR[_tcslen(pBuf) + TEXT("Append") + 1];
  _tcscpy(pNew,pBuf);
  _tcscat(pNew,TEXT("Append"));
  delete []pBuf;
  pBuf = pNew;
  
  呃,没错,的确如此,如果我们需要在一个数组末尾追加新值,这些麻烦的事情我们必须要亲身经历的。还好,我们现在终于可以和这种折磨人的玩意说Goodbye了。对于string而言,追加新值?很简单,就像JAVA一样:
  strA += TEXT("Append");
  
  是的,你没看错,就是一条语句,再无别处。
  
  对于数组,对于容器,同样如此:
  strB += szB;
  strC += &vtC[0];
  
  
  5.与API函数打交道
  
  Windows平台的API函数,自然是要照顾C的使用者。所以,可以这么说:大部分的API函数,为了能够在C中调用,基本上采用的都是C接口的写法。而TSTRING,确切地说,是一个class,而不是一个value type,所以无法直接赋值。
  
  以CreateFile为例,其声明如下:
    HANDLE CreateFile(
    LPCTSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile
    );
 
    第一个参数是LPCTSTR,为一个指针,所以这样直接赋值铁定是通不过编译的:
    CreateFile(strA, ...);
   
    还好,伟大的STL构建者已经为我们考虑到了这个问题,我们只需要调用c_str函数即可:
    CreateFile(strA.c_str(), ...);        
   
    类似,c_str还可以用在_tcslen,_tcscat等纯粹的字符串函数。