//========================================================================
//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等纯粹的字符串函数。

string也可以很精彩相关推荐

  1. 《Linux命令行大全》:1-6:重定向和管道(很精彩)

    <Linux命令行大全>:1-6:重定向和管道(很精彩) https://www.toutiao.com/i6937081007581430303/?tt_from=weixin& ...

  2. Linux那些事儿之我是U盘(5)外面的世界很精彩

    看代码之前,我曾经认真的思考过这么一个问题,我需要关注的仅仅是drivers/usb/storage/目录下面那相关的3000多行代码吗?就是这样几个文件就能让一个个不同的U盘在Linux下面工作起来 ...

  3. “使能”数字化 “浙”里很精彩

    ▼ 更多精彩推荐,请关注我们 ▼ 浙江省"十万企业上云"进行得如火如荼.该行动计划旨在以云计算技术和平台为支撑,切实转变经济发展方式,降低企业信息系统构建成本,提高企业信息化应用水 ...

  4. 很精彩的一篇传道文 (寻找罗素的三激情时发现的)

    很精彩的一篇传道文,父传女道. http://blog.sina.com.cn/s/blog_4cd081e901017heq.html 爸爸: 读了你的<罗丹的启迪>,我真的受到启迪了. ...

  5. #MEM课程#《工程经济》第1课--谢老师讲的很精彩

    1天的工程经济学,谢老师讲的很精彩,在课程中穿插了很多政治.经济.社会的实例.晚上回来又简单的梳理了一下今天给我留下深刻印象的知识点,以增加记忆. 一.绪论 1.1776年,美国发表<独立宣言& ...

  6. 二零一五,外面的世界很精彩

    [二零一五,我大四了]     走到"二"的年纪里,也是经历了一个又一个的终结点.六年级.初三.高三,时光荏苒,这一年,我大四了,又来到了这样一个终结点. 四年之前,刚刚来到廊坊师 ...

  7. String是一个很普通的类 - Java那些事儿

    上一篇我们讲了Java中的数组,其实是为本章的内容做准备的,String这个类是我们在写Java代码中用得最多的一个类,没有之一,今天我们就讲讲它,我们打开String这个类的源码: 声明了一个cha ...

  8. 普通的java类型是指,String是一个很普通的类 - Java那些事儿

    上一篇我们讲了Java中的数组,其实是为本章的内容做准备的,String这个类是我们在写Java代码中用得最多的一个类,没有之一,今天我们就讲讲它,我们打开String这个类的源码: 声明了一个cha ...

  9. “宅一族”大数据报告:喜欢学习,喜欢健身,生活同样很精彩

    [数据猿导读]近年来,有越来越多的人喜欢"宅"在家里,他们用手机打发一天,他们沉迷于自己的兴趣.爱好不可自拔.尽管这种"宅文化"一兴起就频频遭到"与社 ...

最新文章

  1. Python广度优先查找和深度优先查找(内附python教程分享)
  2. Flask 框架app = Flask(__name__) 解析
  3. GItHub--Makedown语法学习(快速入门)
  4. OO第一单元总结__多项式求导问题
  5. NLP之路-python爬虫
  6. 第2章—装配Bean—自动化装配Bean
  7. C/C++三个标准设备文件句柄
  8. 限流, 熔断,降级笔记
  9. linux vi 替换字符串,vi字符串替换命令
  10. 离散数学在计算机相关领域的应用
  11. #多个基因批量cox 多因素回归cox univariate Adjust for age sex单个基因cox 回归分析 多因素 矫正年龄性别之后的cox回归分析 矫正年龄性别之后的cox生存分析
  12. 计算机类专业学习难度排行,大学最难学的十大专业排名
  13. 基于显著性检验分析两个样本分布相似度及Python实现—— t检验、拟合优度检验、KS检验、Wilcoxon符号秩检验、H检验、Mann-Whitney秩检验、P值的意义、API汇总
  14. oracle sys改密码,忘记oracle的sys用户密码怎么修改
  15. HAPI使用方法总结(HITRAN数据库,HITEMP数据库)
  16. 基于两个移动平均线交叉的EA
  17. prototype.js开发者手册
  18. 项目干系人管理-知识领域
  19. MeterSphere:超好用的开源测试平台
  20. 在vue中使用web3.js开发以太坊dapp

热门文章

  1. oracle虑重语句,db基本语句(oracle)
  2. curl 怎么在xp下使用_Http Post 快速使用
  3. 异步任务,邮箱任务,定时任务
  4. 实验6 实践课程中的程序
  5. c语言mergesort 参数,归并排序C语言兑现MergeSort
  6. 【C语言进阶深度学习记录】二十七 C语言中字符串的相等比较
  7. Nginx----基础
  8. upc 9519 New Game
  9. Android SDK Manager 在win8.1上的闪退问题【转载】
  10. [Leetcode][第20题][JAVA][有效的括号][栈][HashMap]