string也可以很精彩
//========================================================================
//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也可以很精彩相关推荐
- 《Linux命令行大全》:1-6:重定向和管道(很精彩)
<Linux命令行大全>:1-6:重定向和管道(很精彩) https://www.toutiao.com/i6937081007581430303/?tt_from=weixin& ...
- Linux那些事儿之我是U盘(5)外面的世界很精彩
看代码之前,我曾经认真的思考过这么一个问题,我需要关注的仅仅是drivers/usb/storage/目录下面那相关的3000多行代码吗?就是这样几个文件就能让一个个不同的U盘在Linux下面工作起来 ...
- “使能”数字化 “浙”里很精彩
▼ 更多精彩推荐,请关注我们 ▼ 浙江省"十万企业上云"进行得如火如荼.该行动计划旨在以云计算技术和平台为支撑,切实转变经济发展方式,降低企业信息系统构建成本,提高企业信息化应用水 ...
- 很精彩的一篇传道文 (寻找罗素的三激情时发现的)
很精彩的一篇传道文,父传女道. http://blog.sina.com.cn/s/blog_4cd081e901017heq.html 爸爸: 读了你的<罗丹的启迪>,我真的受到启迪了. ...
- #MEM课程#《工程经济》第1课--谢老师讲的很精彩
1天的工程经济学,谢老师讲的很精彩,在课程中穿插了很多政治.经济.社会的实例.晚上回来又简单的梳理了一下今天给我留下深刻印象的知识点,以增加记忆. 一.绪论 1.1776年,美国发表<独立宣言& ...
- 二零一五,外面的世界很精彩
[二零一五,我大四了] 走到"二"的年纪里,也是经历了一个又一个的终结点.六年级.初三.高三,时光荏苒,这一年,我大四了,又来到了这样一个终结点. 四年之前,刚刚来到廊坊师 ...
- String是一个很普通的类 - Java那些事儿
上一篇我们讲了Java中的数组,其实是为本章的内容做准备的,String这个类是我们在写Java代码中用得最多的一个类,没有之一,今天我们就讲讲它,我们打开String这个类的源码: 声明了一个cha ...
- 普通的java类型是指,String是一个很普通的类 - Java那些事儿
上一篇我们讲了Java中的数组,其实是为本章的内容做准备的,String这个类是我们在写Java代码中用得最多的一个类,没有之一,今天我们就讲讲它,我们打开String这个类的源码: 声明了一个cha ...
- “宅一族”大数据报告:喜欢学习,喜欢健身,生活同样很精彩
[数据猿导读]近年来,有越来越多的人喜欢"宅"在家里,他们用手机打发一天,他们沉迷于自己的兴趣.爱好不可自拔.尽管这种"宅文化"一兴起就频频遭到"与社 ...
最新文章
- Python广度优先查找和深度优先查找(内附python教程分享)
- Flask 框架app = Flask(__name__) 解析
- GItHub--Makedown语法学习(快速入门)
- OO第一单元总结__多项式求导问题
- NLP之路-python爬虫
- 第2章—装配Bean—自动化装配Bean
- C/C++三个标准设备文件句柄
- 限流, 熔断,降级笔记
- linux vi 替换字符串,vi字符串替换命令
- 离散数学在计算机相关领域的应用
- #多个基因批量cox 多因素回归cox univariate Adjust for age sex单个基因cox 回归分析 多因素 矫正年龄性别之后的cox回归分析 矫正年龄性别之后的cox生存分析
- 计算机类专业学习难度排行,大学最难学的十大专业排名
- 基于显著性检验分析两个样本分布相似度及Python实现—— t检验、拟合优度检验、KS检验、Wilcoxon符号秩检验、H检验、Mann-Whitney秩检验、P值的意义、API汇总
- oracle sys改密码,忘记oracle的sys用户密码怎么修改
- HAPI使用方法总结(HITRAN数据库,HITEMP数据库)
- 基于两个移动平均线交叉的EA
- prototype.js开发者手册
- 项目干系人管理-知识领域
- MeterSphere:超好用的开源测试平台
- 在vue中使用web3.js开发以太坊dapp
热门文章
- oracle虑重语句,db基本语句(oracle)
- curl 怎么在xp下使用_Http Post 快速使用
- 异步任务,邮箱任务,定时任务
- 实验6 实践课程中的程序
- c语言mergesort 参数,归并排序C语言兑现MergeSort
- 【C语言进阶深度学习记录】二十七 C语言中字符串的相等比较
- Nginx----基础
- upc 9519 New Game
- Android SDK Manager 在win8.1上的闪退问题【转载】
- [Leetcode][第20题][JAVA][有效的括号][栈][HashMap]