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之旅.第九章.并发编程..
- Linux软件安装包中devel与非devel包之间的区别
- Winform获取应用程序的当前路径的方法集合,具体如下,值得收藏
- 线程属性--十分重要的概念
- 计算机安全模式无法进入安全模式,如何解决无法在Windows 10中进入安全模式的问题...
- 如何形成欧姆接触_Y5T307 半导体激光器欧姆接触,以及欧姆接触与肖特基接触的区别...
- 【测试基础】测试用例的设计方法
- Vue (响应式原理-模拟-2-Observer)
- 实现option上下移动_JS实现Select的option上下移动的方法
- python棋盘覆盖问题_棋盘覆盖问题可视化动图——python
- 映射网络驱动器 net use
- 【新人c语言强化训练 】 c 语言强化练习2。1 数据对齐[zt]
- 92 款中国风古风古韵中文字体美工古代书法字体打包下载
- 时钟天气小插件显示没服务器,天气时钟小插件大全
- 人工智能与大数据就业前景_大数据,数据分析和人工智能方向就业前景
- typora 编辑器菜单栏不见了:打开了一体化模式
- 录音文件怎么转换成mp3格式
- 全国高校计算机能力挑战赛赛事通知
- sails mysql_Sails+MVC+Mysql+Node+学习笔记一
- 赢在互联网的起跑线上