转载: 谈新手对CString的使用

<script src="http://cmt.pconline.com.cn/index.jsp?url=http%3A%2F%2Fwww.pconline.com.cn%2Fpcedu%2Fempolder%2Fgj%2Fc%2F0507%2F676340.html&referer=&" type="text/javascript"></script> <script src="http://www.pconline.com.cn/pcedu/js/count_empolder.js" language="JavaScript" type="text/javascript"> </script> <script language="JavaScript" type="text/javascript"> function MM_findObj(n, d) { //v4.01 var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i
通行证: 用户 密码
http://www.pconline.cn/
汽车网 | 游戏网 | 时尚女性
<script src="http://adv.pconline.com.cn/adpuba/show?id=pc.rjzx.kaifa.wenzhang.shanglan.&media=js&pid=cs.pconline.rjzx.shanglan." type="text/javascript"></script>
分站:北京 上海 广州 深圳 香港
广西 重庆 山东 江苏 辽宁 福建
<script type="text/javascript" language="JavaScript"> var focusControl = document.forms["s"].elements["q"]; if (focusControl.type != "hidden") focusControl.focus(); </script>
首 页 | 今日报价 | 产业资讯 | 数码世界 | 硬件资讯 | 软件资讯 | 下 载 | 游 戏 |
论 坛 | 产 品 库 | 渠道商情 | 招聘培训 | 二    手 | 评 测 室 | 导 购 | 社 区 |
摄影
部落
手 机
数码相机
随身听
 DIY配件
笔记本
 台式机
摄像机
精品廊
 
<script src="http://adv.pconline.com.cn/adpuba/show?id=pc.rjzx.kaifa.wenzhang.tonglan.&media=js&pid=cs.pconline.rjzx.tonglan1." type="text/javascript"></script>
<script src="http://www.pconline.com.cn/js/pcedu_art_menu.js" type="text/javascript"></script>
 软件首页 | 软件新闻 | 软件评测 | 教你学电脑 | 软件应用 | 信息安全 | 创意设计 | 开发特区 | 软件下载 | 行业软件
 
 特色专区: | 网络聊天 | 精品导用 | 组网专栏 | 设计素材 | Flash 剧场 | CG专栏
 
您现在的位置:软件资讯 > 开发特区 > 开发语言 > C/C++免费新闻代码RSS新闻聚合
  谈新手对CString的使用出处:csdn
[ 2005-07-29 10:02:18 ] 作者:i_like_cpp 责任编辑:moningfeng
<script src="http://adv.pconline.com.cn/adpuba/show?id=pc.rjzx.kaifa.wenzhang.biaotixia.&media=js&pid=cs.pconline.rjzx.biaoti." type="text/javascript"></script>
<script type="text/javascript"> var speed=100 demo2.innerHTML=demo1.innerHTML function Marquee(){ if(demo2.offsetTop-demo.scrollTop<=0) demo.scrollTop-=demo1.offsetHeight else{ demo.scrollTop++ } } var MyMar=setInterval(Marquee,speed) demo.οnmοuseοver=function() {clearInterval(MyMar)} demo.οnmοuseοut=function() {MyMar=setInterval(Marquee,speed)}</script>
CString类功能强大,比STL的string类有过之无不及.新手使用CString时,都会被它强大的功能所吸引.然而由于对它内部机制的不 了解,新手在将CString向C的字符数组转换时容易出现很多问题.因为CString已经重载了LPCTSTR运算符,所以CString类向 const char *转换时没有什么麻烦,如下所示:

  char a[100];
  CString str("aaaaaa");
  strncpy(a,(LPCTSTR)str,sizeof(a));

width="320" scrolling="no" height="280" frameborder="0" align="left" marginheight="0" marginwidth="0" id="ad_top" name="ad_top" src="http://adv.pconline.com.cn/adpuba/show?id=pc.rjzx.kaifa.wenzhang.hzh.&media=html&pid=cs.pconline.rjzx.hzh.">  或者如下:

  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 *
Flash剧场全新改版,精品Flash让你看够玩够!



 
更多相关搜索: CString.. c.. c++..
 
<script src="http://www.pconline.com.cn/js/ad_dell.js" language="javascript" type="text/javascript"></script>
戴尔笔记本迎五一限时现金折扣,免费升级处理器!

<script src="http://www.pconline.com.cn/js/ad_text_pcauto.js" language="javascript" type="text/javascript"></script> 美国媒体惊叹吉利车价之低 0奇瑞A5上市 国货力拼洋品牌

评论人 评论共5查看完整内容 顺序查看 我的最近评论发表时间
5 楼 [ 回复]
6楼的是傻比 CString szMyString(TEXT("Convertion")); char ch[100] = {0}; int iLength = szMyString.GetLength(... 05-10 10:03
4 楼 [ 回复]
pyxdf 回复 2 楼(飞天):我也想知道啊,他说的那个方法“f:/linklist/linklistview.cpp(446) : error C2664: “strncpy”: 不能将参数 2 从“CStr... 04-17 16:10
3 楼 [ 回复]
newman 很不错,感谢! 10-19 10:43
2 楼 [ 回复]
飞天 怎么样把一个CString类转换成一个char数组类? 08-06 16:27
1 楼 [ 回复]
EarthMan Very good! 08-02 15:09

<script src="http://adv.pconline.com.cn/adpuba/show?id=pc.rjzx.kaifa.wenzhang.xiafang.&media=js&pid=cs.pconline.rjzx.xiafang." type="text/javascript"></script>
 
《编程开发语言》近期热评文章:        查看全部...

<script src="http://adv.pconline.com.cn/adpuba/show?id=pc.rjzx.kaifa.wenzhang.xiafang.&media=js&pid=cs.pconline.rjzx.xiafang." type="text/javascript"></script>
<script type="text/javascript"> var speed=100 demoo2.innerHTML=demoo1.innerHTML function Marquee(){ if(demoo2.offsetTop-demoo.scrollTop<=0) demoo.scrollTop-=demoo1.offsetHeight else{ demoo.scrollTop++ } } var MyMar=setInterval(Marquee,speed) demoo.οnmοuseοver=function() {clearInterval(MyMar)} demoo.οnmοuseοut=function() {MyMar=setInterval(Marquee,speed)}</script>
发给好友 我要报错 投稿给我们 加入收藏 返回顶部 

本栏今日更新
相关文章
·FireTune新版:Firfox优化轻松搞定
·音效增强!DFX 7.500 for WMP发布
·微软恶意软件移除工具可杀Zotob
·Google或MSN地图?Flash Earth整合
·强力清除软件使用后的蛛丝马迹
·六大闪光点:QQ2005 beta 3泄漏版试用
·超酷!Mac系统播客工具提供Win版
·PConline联合超级兔子狂送注册码!
·C语言中可变参数的用法
·C++程序设计最佳实践
·C++:谁动了我的指针
·关于文曲星上猜数字游戏的c编程方法
·C++中的虚函数(virtual function)
·链表的C语言实现之动态内存分配
·CRichEditCtrl实现MSN/QQ动画表情
·Windows API-GDI入门基础知识详解(3)

完美时尚娱乐:2004年腾讯QQ评测大观
精彩无限:MSN Shell4使用指南
亲手制作鲜花情人贺卡送给她
挑战伏明霞?企鹅跳水游戏,看你能得多少分?
 

新闻搜索
高级搜索
Flash排行榜
·快来看看!芙蓉姐姐进军歌坛
·动感漂移-头文字D赛车
·头文字D插曲-一路向北
·暴笑恶搞MV-《从良》
·笑谈广东话-叽叽噶噶
·恶搞!PP鸡打劫记之一
·下辈子如果我还记得你
·疯狂射击游戏-火凤凰号
·悲怆!披着羊皮的狼
·搞笑MV-亲爱的对不起
<script src="http://adv.pconline.com.cn/adpuba/show?id=pc.rjzx.kaifa.wenzhang.youce.&media=js&pid=cs.pconline.rjzx.youce-150235." type="text/javascript"></script>
热点专题
·挑战十大Flash智益游戏
·QQ辅助软件使用指南
·向"流氓软件"大声说不!
·惜别!毕业十大必唱歌曲
·常用软件的另类用法集
·搜索技巧:网罗天下的乐趣
·电脑艺术设计大师之路连载
·老歌歪唱Flash MV爆笑欣赏
·超级兔子狂送注册码!
·引领时尚:K8翻唱上传技巧
·Photoshop立体光影魔术!
·Photoshop绘水果饕餮大餐
IT培训十大热门文章
<script src="http://www.pconline.com.cn/pcjob/js/files_top10.js" type="text/javascript"></script>
软件资讯每日更新
width="170" scrolling="no" height="177" frameborder="0" src="http://www.pconline.com.cn/pcedu/hezhuo/pcedu_news_day/" marginwidth="0" marginheight="0">· 美文:我用电脑黑了全世界
· 月薪5万,微软最新面试题
· 微软召开黑客大会(图)
· 美军超级黑客特种部队揭密
· Linux下软件安装详解(图)
· 软考模拟软件(网络工程师)
· 2005年软件水平考试资料
· 世界编程大赛第1名写的程序
· 某变态公司的面试IQ题
<script src="http://www.pconline.com.cn/js/but.js" type="text/javascript"> </script>
 


广东省通信管理局
粤ICP证号:000010
技术支持与报障:support@pconline.com.cn
        020-87568837
        

对本站有任何建议、意见或投诉,请点这里在线提交.
本网站简体、繁体两种版本,以简体版为准
PConline版权所有,未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任
__
<script type="text/javascript"> menu.innerHTML=span_menu.innerHTML; span_menu.innerHTML=""; </script> <script type="text/javascript"> top12.innerHTML=span_top12.innerHTML; span_top12.innerHTML=""; </script> <script id="_comment_script_" defer="defer" src="http://cmt.pconline.com.cn/?" type="text/javascript"></script> <script type="text/javascript">_comment_script_.src="http://cmt.pconline.com.cn/?";</script> <script src="http://acount.pconline.com.cn/wzcount/artbrowse.php?groupname=%BF%C6%BC%BC%B6%AF%CC%AC&subgroupname=&id=676340&title=&response=1" language="javascript" type="text/javascript"></script> <script type="text/javascript" language="JavaScript"> </script> <script src="http://secure-cn.imrworldwide.com/v51.js" type="text/javascript" language="JavaScript"></script>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值