CString操作指南[VC/C++编程]
本文“CString操作指南[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
通过阅读本文你可以学习若何有效地利用CString.
CString 是一种很有效的数据范例.它们很大程度上简化了MFC中的很多操作,使得MFC在做字符串操作的时刻便利了很多.不管怎样,利用CString有很多特别的本领,分外是关于纯C后台下走出来的程序员来说有点难以学习.这篇文章就来谈论这些本领.
利用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() 函数来格局化一个字符串,还不如用 CString 对象的Format()办法:
CString s;
s.Format(_T("The total is %d"), total);
用这种办法的好处是你不用耽忧用来存放格局化后数据的缓冲区能否充足大,这些工作由CString类替你完成.
格局化是一种把别的不是字符串范例的数据转化为CString范例的最常用本领,比方,把一个整数转化成CString范例,可用以下办法:
CString s;
s.Format(_T("%d"), total);
我老是对我的字符串利用_T()宏,这是为了让我的代码至少有Unicode的意识,当然,关于Unicode的话题不在这篇文章的谈论范围._T()宏在8位字符环境下是以下定义的:
#define _T(x) x // 非Unicode版本(non-Unicode version)
而在Unicode环境下是以下定义的:
#define _T(x) L##x // Unicode版本(Unicode version)
所以在Unicode环境下,它的效果就相当于:
s.Format(L"%d", total);
假如你认为你的程序大概在Unicode的环境下运行,那么开始在乎用 Unicode 编码.比方说,不要用 sizeof() 操作符来得到字符串的长度,因为在Unicode环境下就会有2倍的偏差.我们可以用一些办法来躲藏Unicode的一些细节,比方在我需求得到字符长度的时刻,我会用一个叫做DIM的宏,这个宏是在我的dim.h文件中定义的,我会在我写的全部程序中都包含这个文件:
#define DIM(x) ( sizeof((x)) / sizeof((x)[0]) )
这个宏不但可以用来办理Unicode的字符串长度的问题,也可以用在编译时定义的表格上,它可以得到表格的项数,以下:
class Whatever { ... };
Whatever data[] = {
{ ... },
...
{ ... },
};
for(int i = 0; i < DIM(data); i++) // 扫描表格探求匹配项.
这里要提醒你的就是一定要注意那些在参数中需求真实字节数的API函数调用,假如你传送字符个数给它,它将不能正常工作.以下:
TCHAR data[20];
lstrcpyn(data, longstring, sizeof(data) - 1); // WRONG!
lstrcpyn(data, longstring, DIM(data) - 1); // RIGHT
WriteFile(f, data, DIM(data), &bytesWritten, NULL); // WRONG!
WriteFile(f, data, sizeof(data), &bytesWritten, NULL); // RIGHT
造成以上缘由是因为lstrcpyn需求一个字符个数作为参数,但是WriteFile却需求字节数作为参数.
一样需求注意的是有时刻需求写出数据的全部内容.假如你仅仅只想写出数据的真实长度,你大概会认为你应当这样做:
WriteFile(f, data, lstrlen(data), &bytesWritten, NULL); // WRONG
但是在Unicode环境下,它不会正常工作.精确的做法应当是这样:
WriteFile(f, data, lstrlen(data) * sizeof(TCHAR), &bytesWritten, NULL); // RIGHT
因为WriteFile需求的是一个以字节为单位的长度.(大概有些人会想“在非Unicode的环境下运行这行代码,就意味着老是在做一个多余的乘1操作,这样不会降低程序的效率吗?”这种设法是多余的,你必必要理解编译器实际上做了什么,没有哪一个C或C++编译器会把这种无聊的乘1操作留在代码中.在Unicode环境下运行的时刻,你也没必要耽忧那个乘2操作会降低程序的效率,记着,这只是一个左移一位的操作罢了,编译器也很乐意为你做这种替换.)
利用_T宏并非意味着你已经成立了一个Unicode的程序,你只是成立了一个有Unicode意识的程序罢了.假如你在默许的8-bit情势下编译你的程序的话,得到的将是一个普通的8-bit的利用程序(这里的8-bit指的只是8位的字符编码,并非指8位的计算机系统);当你在Unicode环境下编译你的程序时,你才会得到一个Unicode的程序.记着,CString 在 Unicode 环境下,里面包含的可都是16位的字符哦.
以上是“CString操作指南[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:声明函数指针并实现回调
- ·下一篇文章:<b>深化理解sizeof</b>
- ·中查找“CString操作指南”更多相关内容
- ·中查找“CString操作指南”更多相关内容