2019年MFC中CString类的用法

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CString 是一种很有用的数据类型。它们很大程度上简化了MFC中的许多操作,使得M FC在做字符串操作的时候方便了很多。不管怎样,使用CString有很多特殊的技巧,特别是

对于纯C背景下走出来的程序员来说有点难以学习。这篇文章就来讨论这些技巧。

使用CString可以让你对字符串的操作更加直截了当。这篇文章不是CString的完全手册,但囊括了大部分常见基本问题。

这篇文章包括以下内容:

CString 对象的连接

格式化字符串(包括int 型转化为CString )

CString 型转化成int 型

CString 型和char* 类型的相互转化

char* 转化成CString

CString 转化成char* 之一:使用LPCTSTR强制转化

CString 转化成char* 之二:使用CString对象的GetBuffer方法

CString 转化成char* 之三: 和控件的接口

CString 型转化成BSTR 型;

BSTR 型转化成CString 型;

V ARIANT 型转化成CString 型;

载入字符串表资源;

CString 和临时对象;

CString 的效率;

总结

下面我分别讨论。

1、CString 对象的连接

能体现出CString 类型方便性特点的一个方面就字符串的连接,使用CString 类型

,你能很方便地连接两个字符串,正如下面的例子:

CString gray("Gray");

CString cat("Cat");

CString graycat = gray + cat;

要比用下面的方法好得多:

char gray[] = "Gray";

char cat[] = "Cat";

char * graycat = malloc(strlen(gray) + strlen(cat) + 1);

strcpy(graycat, gray);

strcat(graycat, cat);

2、格式化字符串

与其用sprintf() 函数或wsprintf() 函数来格式化一个字符串,还不如用CStrin

g 对象的Format()方法:

CString s;

(_T("The total is %d"), total);

用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。

格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧,比如,把一个整数转化成CString类型,可用如下方法:

CString s;

(_T("%d"), total);

我总是对我的字符串使用_T()宏,这是为了让我的代码至少有Unicode的意识,当然,关于Unicode的话题不在这篇文章的讨论范围。_T()宏在8位字符环境下是如下定义的:

#define _T(x) x . };

Whatever data[] = {

{ ... },

...

{ ... },

};

for(int i = 0; i < DIM(data); i++) 1.2f4.8f."表示的)并没有隐含一个强

制类型转换操作符。你会得到什么结果呢?

一个令人惊讶的结果,我们得到的实际结果串是:

"Mew! I love GrayCat"。

因为MFC 的设计者们在设计CString 数据类型时非常小心,CString 类型表达式求值后指向了字符串,所以这里看不到任何象Format 或sprintf 中的强制类型转换,你仍

然可以得到正确的行为。描述CString 的附加数据实际上在CString 名义地址之后。

有一件事情你是不能做的,那就是修改字符串。比如,你可能会尝试用","代替"."(

不要做这样的,如果你在乎国际化问题,你应该使用十进制转换的National Language S upport 特性,),下面是个简单的例子:

CString v(""); ; .

if(p != NULL)

*p = _T(\0);

();

这是GetBuffer 的第一种用法,也是最简单的一种,不用给它传递参数,它使用默认值0,意思是:"给我这个字符串的指针,我保证不加长它"。当你调用ReleaseBuffer 时

,字符串的实际长度会被重新计算,然后存入CString 对象中。

必须强调一点,在GetBuffer 和ReleaseBuffer 之间这个范围,一定不能使用你要

操作的这个缓冲的CString 对象的任何方法。因为ReleaseBuffer 被调用之前,该CSt ring 对象的完整性得不到保障。研究以下代码:

CString s(...);

LPTSTR p = ();

这个指针p 发生了很多事情

int n = (); ....", args, ...); . 部分省略许多细节

CString s = buffer;

虽然更好的形式可以这么做:

CString s;

(_T("%...."), args, ...);

如果你的字符串长度万一超过256 个字符的时候,不会破坏堆栈。

另外一个常见的错误是:既然固定大小的内存不工作,那么就采用动态分配字节,这种做法弊端更大:

int len = lstrlen(parm1) + 13 lstrlen(parm2) + 10 + 100;

char * buffer = new char[len];

sprintf(buffer, "%s is equal to %s, valid data", parm1, parm2);

CString s = buffer;

......

delete [] buffer;

它可以能被简单地写成:

CString s;

(_T("%s is equal to %s, valid data"), parm1, parm2);

需要注意sprintf 例子都不是Unicode 就绪的,尽管你可以使用tsprintf 以及用

_T() 来包围格式化字符串,但是基本思路仍然是在走弯路,这这样很容易出错。

CString to char * 之三:和控件的接口;

我们经常需要把一个CString 的值传递给一个控件,比如,CTreeCtrl。MFC为我们提供了很多便利来重载这个操作,但是在大多数情况下,你使用"原始"形式的更新,因此需要将墨某个串指针存储到TVINSERTITEMSTRUCT 结构的TVITEM 成员中。如下:

相关文档
最新文档