`
zero_dian
  • 浏览: 17838 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

谈新手对CString的使用

阅读更多
CString类功能强大,比STL的string类有过之无不及.新手使用CString时,都会被它强大的功能所吸引.然而由于对它内部机制的不了解,新手在将CString向C的字符数组转换时容易出现很多问题.因为CString已经重载了LPCTSTR运算符,所以CString类向const char *转换时没有什么麻烦,如下所示:
  char a[100];
  CString str("aaaaaa");
  strncpy(a,(LPCTSTR)str,sizeof(a));
  或者如下:

  strncpy(a,str,sizeof(a));

  以上两种用法都是正确地.因为strncpy的第二个参数类型为const char *.所以编译器会自动将CString类转换成const char *.很多人对LPCTSTR是什么东西迷惑不解,让我们来看看:

  1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.

  2.C表示const

  3.T是什么东西呢,我们知道TCHAR在采用UNICODE方式编译时是wchar_t,在普通时编译成char那么就可以看出LPCTSTR(PCTSTR)在UINCODE时是const wchar_t *,PCWSTR,LPCWSTR,在多字节字符模式时是const char *, PCSTR,LPCSTR.接下来我们看在非UNICODE情况下,怎样将CString转换成char *,很多初学者都为了方便采用如下方法:
  (char *)(LPCSTR)str

  这样对吗?我们首先来看一个例子:
  CString str("aa");
  strcpy((char *)(LPCTSTR)str,"aaaaaaaa");
  cout<<(LPCTSTR)str<<endl;

  在Debug下运行出现了异常,我们都知道CString类内部有自己的字符指针,指向一个已分配的字符缓冲区.如果往里面写的字符数超出了缓冲区范围,当然会出现异常.但这个程序在Release版本下不会出现问题.原来对CString类已经进行了优化.当需要分配的内存小于64字节时,直接分配64字节的内存,以此类推,一般CString类字符缓冲区的大小为64,128,256,512...这样是为了减少内存分配的次数,提高速度.

  那有人就说我往里面写的字符数不超过它原来的字符数,不就不会出错了,比如
  CString str("aaaaaaa");
  strcpy((char *)(LPCTSTR)str,"aa");
  cout<<(LPCTSTR)str<<endl;

  这样看起来是没什么问题.我们再来看下面这个例子:
  CString str("aaaaaaa");
  strcpy((char *)(LPCTSTR)str,"aa");
  cout<<(LPCTSTR)str<<endl;
  cout<<str.GetLength()<<endl;

  我们看到str的长度没有随之改变,继续为7而不是2.还有更严重的问题:
  CString str("aaaaaaa");
  CString str1 = str;
  strcpy((char *)(LPCTSTR)str,"aa");
  cout<<(LPCTSTR)str<<endl;
  cout<<(LPCTSTR)str1<<endl;

  按说我们只改变了str,str1应该没有改变呀,可是事实时他们都变成了"aa".难道str和str1里面的字符指针指向的缓冲区是一个.我们在Effective C++里面得知,如果你的类内部有包含指针,请为你的类写一个拷贝构造函数和赋值运算符.不要让两个对象内部的指针指向同一区域,而应该重新分配内存.难道是微软犯了错?

  原来这里还有一个"写时复制"和"引用计数"的概念.CString类的用途很广,这样有可能在系统内部产生大量的CString临时对象.这时为了优化效率,就采用在系统软件内部广泛使用的"写时复制"概念.即当从一个CString产生另一个CString并不复制它的字符缓冲区内容,而只是将字符缓冲区的"引用计数"加1.当需要改写字符缓冲区内的内容时,才分配内存,并复制内容.以后我会给出一个"写时复制"和"引用计数"的例子我们回到主题上来,当我们需要将CString转换成char *时,我们应该怎么做呢?其时只是麻烦一点,如下所示:
  CString str("aaaaaaa");
  strcpy(str.GetBuffer(10),"aa");
  str.ReleaseBuffer();

  当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer();还有很重要的一点就是,在能使用const char *的地方,就不要使用char *
分享到:
评论

相关推荐

    CString使用

    主要方便MFC编程人员,快速使用CString类来做开发使用

    Cstring的使用大全

    Cstring的使用大全,很详细,介绍Cstring的各种使用方法

    CString使用方法~

    从网上找到的一些cstring的用法!!粘贴成了txt

    CString操作大全指南

    CString 转化成 char* 之一:使用LPCTSTR强制转化;CString 转化成 char* 之二:使用String对象的GetBuffer方法;CString 转化成 char*之三;和控件的接口;CString 型转化成 BSTR 型;BSTR 型转化成 CString 型;...

    QT中使用MFC的例子 可使用CString、MessageBox等MFC类和方法

    一个QT使用MFC的例子,示例为QT工程,其中引入MFC库,使用CString类,MessageBox方法进行了验证。示例工程为QT4+VS2013。此方式在QT3,QT4,QT5和VC6,VS2013,VS2015,VS2018中亦可使用。

    CString类的使用

    CString类的函数及具体使用,String类作为MFC的常用类,当之无愧。可以这样说,只要是从事MFC开发,...因为字符串的使用比较普遍,而CString类又提供了对字符串的便捷操作,所以它给MFC开发人员带来了高的开发效率。

    CString

    关于Cstring 类

    cstring类使用

    非常全面的cstring类使用介绍和实例

    CString转UTF8,UTF8转CString

    CString转UTF8,UTF8转CString。

    MFC中CString的使用介绍

    CString中数字与字符串间的相互转换。

    linux下的CString

    CString,从网上收集的,移植到linux可以直接使用,希望对大家有用,也为自己备用着

    CString 操作指南

    CString常用操作以及使用过程中的注意事项,很有用

    CString字符串全攻略

    CString与各种类型字符之间转换和方法使用,例如char型,指针等

    MFC 数值转换 CString >> HEX>>DEC>> CString

    在MFC通信模块中经常会遇到数据类型的转换,比如会收到下位机的数据(如:10 20 30 40 64 DD ),需要在Dailog中显示'0x64'为'100 Dec',那必须先从CString &gt;&gt; HEX&gt;&gt;DEC&gt;&gt; CString 实行代码如下: CString readData...

    cstring头文件 适用于linux

    cstring头文件 适用于linux

    CString介绍

    CStringCStringCStringCStringCStringCStringCStringCStringCStringCStringCStringCStringCString介绍CString介绍CString介绍CString介绍CString介绍CString介绍CString介绍

    CString 操作指南 CString 进阶指导

    CString 操作指南 CString 进阶指导 CString 使用

    CString实现的源代码

    这2篇word文档有助于对CString整理理解,纯粹看代码往往很容易迷失方向,如果遇到不理解的函数可以直接查阅源代码。我基本上把CString中常用的函数都看了一遍,像GetBuffer,ReleaseBuffer,AllocBuffer等等,感觉...

    Cstring成员函数详解

    对Cstring类的所有成员函数进行了详解,并且讲解了Cstring与其他类型之间的转换。

    CString string char 之间的相互转换

    int CString_unicode_to_char(CString str,char* buff) CString char_to_CString_unicode(char * szAnsi, int len) CString string_to_CString_unicode(std::string str) CString string_to_CString_unicode_Ex(std:...

Global site tag (gtag.js) - Google Analytics