分享
 
 
 

CString related

王朝vc·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

CString是属于MFC的类,实际上程序中,好多地方都要用到标准c++里面char*,或者LPCTSTR。比如cout<<就不能跟CString类对象,而要将其转化成LPCTSTR。这里,前几个问题都说的有关标准c++的char*,后面说CString的使用中一些有必要注意的地方。

1 字符数组名,字符串常量,和字符指针都属于同一种类型.

char buffer[10]; char* pc; "hello"; 可以互相赋值.

2 const char* p; 常量指针,指向常量的指针.

char* const p; 该指针是常量,不允许更改.

2 e.g.

if ("join"=="join")

cout<<"equal \n";

else

cout<<"not equal \n";

结果是 not equal.因为程序中两个字符串的比较实际上是两个字符串地址的比较.编译时候给了这两个字符串不同的地址,所以地址不同.

如果要比较字符串的字面意义,可以用strcmp().

3 e.g.

#include<iostream.h>

void main()

{

char buffer[10]="ABC";

char *pc;

pc="hello";

cout<<pc<<endl;

pc++;

cout<<pc<<endl;

cout<<*pc<<endl;

pc=buffer;

cout<<pc;

}

result:

hello

ello

e

ABC

说明:结果容易理解,要说明的是,当pc指向buffer以后,字符串常量"hello"仍逗留在内存的data区,但是再也访问不到该字符串了.数据丢失.

所以,对于字符串常量赋值给字符指针的情形,一般指针不再重新赋值. (也就是说应该用指针常量char* const p)

3' CString的工作原理。下面内容应该是正确的,原来看到有地方说CString赋值就是赋指针,对原来的CString对象修改内容时候,就会影响到被赋值得CString对象。好像CString对象要赋值就不能更改内容一样。实际看了一下,应该是以下面的为准。

当使用一个CString对象a来初始化另一个CString对象b时,为了节省空间,新对象b并不分配空间,它所要做的只是将自己的指针指向对象a的那块内存空间,只有当需要修改对象a或者b中的字符串时,才会为新对象b申请内存空间,这叫做写入复制技术(CopyBeforeWrite)。引用自:http://www.123xz.net/article/article_8181_1.html

notes: 文章中,通过GetData()取得CStringData的对象指针。

看了几篇文章,感觉上面的一篇说的相对更明白清楚。

4 LPCTSTR 和 LPTSTR的区别和const char* p; char * const p;的对应关系.

long pointer const Tchar string , const TCHAR* : LPCTSTR

TCHAR*: LPTSTR

为什么要用LPCTSTR和 LPTSTR代替char*,是因为要用到TCHAR。

5 遇到的问题:

const char sz[] = (LPCTSTR)(pMetrics->strKey);

const char *sz= (LPCTSTR)(pMetrics->strKey);

为什么编译时候,后者能通过,而前者报错: error C2440: can't convert from 'ATL::CSimpleStringT<BaseType,t_bMFCDLL>::PCXSTR'

什么是ATL阿? 为什么会出现这个错误呢?

6 (LPCTSTR)和getbuffer()的区别: 看一下关于CString总结.

http://www.zahui.com/html/1/1753.htm

http://blog.csdn.net/pinping1314/archive/2005/04/21/357260.aspx

7 把CString转化成c类型的null结尾的字符串:

(1). 最简单的,用(LPCTSTR)强制类型转换把CString转换成LPCTSTR,(LPCTSTR)强制类型转换操作符返回一个指针,指向从一个CString得到的只读的null结尾的c类型字符串.这个指针实际上指向CString的数据区.如果该CString对象超过边界或者被自动删除,或者被某些操作改变了内容,这个LPCTSTR指针将不再有效.应该把这个指针指向的string当作暂时的.

CString只允许一种强制类型转换,即强制转换为LPCTSTR。强制转换为LPTSTR (非常量指针)是错误的(即(LPTSTR)(LPCTSTR)str)。按照老习惯,将CString强制转换为LPTSTR只能伤害自己。有时在程序中没有发现出错,那只是碰巧。转换到非常量指针的正确方法是调用GetBuffer()方法。

(3). 可以用CString本身的函数,比如SetAt,来修改string对象的单个字符. 如果想把CString对象的内容拷贝出来修改,可以用strcpy(Unicode/MBCS-portable _tcscpy),来把CSting对象拷贝到一个单独的buffer里面,安全修改这些字符串.比如:

CString theString( "This is a test" );

LPTSTR lpsz = new TCHAR[theString.GetLength()+1];

_tcscpy(lpsz, theString);

//... modify lpsz as much as you want

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有