codeproject:CString Management通过阅读本文你可以学习如何有效地使用 CString。">
或者这样: 【程序编程相关:CBitmapButton的使用 】
cstring hex = _t("fab"); cstring decimal = _t("4011"); assert(_tcstoul(hex, 0, 16) == _ttoi(decimal));4.cstring 型与 char* 类型的相互转化 这是初学者使用 cstring 时最常见的问题.有了 c++ 的帮助,很多问题你不需要深入的去考虑它,直接拿来用就行了,但是如果你不能深入了解它的运行机制,又会有很多问题让你迷惑,特别是有些看起来没有问题的代码,却偏偏不能正常工作.比如,你会奇怪为什么不能写向下面这样的代码呢: 【推荐阅读:vc下使用windows的性能计数器简介】
cstring graycat = cstring("gray") + cstring("cat");或者这样: 【扩展信息:visual c++键盘快捷键大全 】
cstring graycat("gray" + "cat");事实上,编译器将抱怨上面的这些尝试.为什么呢?因为针对cstring 与 lpctstr数据类型的各种各样的组合,“ +” 运算符 被定义成一个重载操作符.而不是两个 lpctstr 数据类型,它是底层数据类型.你不能对基本数据(如 int.char 或者 char*)类型重载 c++ 的运算符.你可以象下面这样做:
cstring graycat = cstring("gray") + "cat";研究一番就会发现:“ +”总是使用在至少有一个 cstring 对象与一个 lpcstr 的场合.注意,编写有 unicode 意识的代码总是一件好事,比如:
cstring graycat = cstring(_t("gray")) + _t("cat");这将使得你的代码可以直接移植.char* 转化为 cstring 现在你有一个 char* 类型的数据,或者说一个字符串.怎么样创建 cstring 对象呢?这里有一些例子:
char * p = "this is a test";或者象下面这样更具有 unicode 意识:
tchar * p = _t("this is a test")或
lptstr p = _t("this is a test");你可以使用下面任意一种写法:
cstring s = "this is a test"; // 8-bit only cstring s = _t("this is a test"); // unicode-aware cstring s("this is a test"); // 8-bit only cstring s(_t("this is a test")); // unicode-aware cstring s = p; cstring s(p);用这些方法可以轻松将常量字符串或指针转换成 cstring.需要注意的是,字符的赋值总是被拷贝到 cstring 对象中去的,所以你可以象下面这样操作:
tchar * p = _t("gray"); cstring s(p); p = _t("cat"); s += p;结果字符串肯定是“graycat”.cstring 类还有几个其它的构造函数,但是这里我们不考虑它,如果你有兴趣可以自己查看相关文档.事实上,cstring 类的构造函数比我展示的要复杂,比如:
cstring s = "this is a test";这是很草率的编码,但是实际上它在 unicode 环境下能编译通过.它在运行时调用构造函数的 multibytetowidechar 操作将 8 位字符串转换成 16 位字符串.不管怎样,如果 char * 指针是网络上传输的 8 位数据,这种转换是很有用的.cstring 转化成 char* 之一:强制类型转换为 lpctstr; 这是一种略微硬性的转换,有关“正确”的做法,人们在认识上还存在许多混乱,正确的使用方法有很多,但错误的使用方法可能与正确的使用方法一样多. 我们首先要了解 cstring 是一种很特殊的 c++ 对象,它里面包含了三个值:一个指向某个数据缓冲区的指针.一个是该缓冲中有效的字符记数以及一个缓冲区长度. 有效字符数的大小可以是从0到该缓冲最大长度值减1之间的任何数(因为字符串结尾有一个null字符).字符记数与缓冲区长度被巧妙隐藏. 除非你做一些特殊的操作,否则你不可能知道给cstring对象分配的缓冲区的长度.这样,即使你获得了该0缓冲的地址,你也无法更改其中的内容,不能截短字符串,也 绝对没有办法加长它的内容,否则第一时间就会看到溢出. lpctstr 操作符(或者更明确地说就是 tchar * 操作符)在 cstring 类中被重载了,该操作符的定义是返回缓冲区的地址,因此,如果你需要一个指向 cstring 的 字符串指针的话,可以这样做:
cstring s("graycat"); lpctstr p = s; 它可以正确地运行.这是由c语言的强制类型转化规则实现的.当需要强制类型转化时,c++规测容许这种选择.... 下一页