CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

char 与 CString转化的问题。

楼主rushing(勇敢的心)2002-09-30 15:04:42 在 VC/MFC / 基础类 提问

CString   m_Dir;  
   
  ......  
   
  char   Drive[4];  
  CString   str=m_Dir.Left(3);    
  strcpy(Drive,(LPCTSTR)str);      
  Drive[3]=0;                           《----这里出错  
   
  编译Debug没错,Release出错。  
   
  如果改成Drive[4]=0;就没事了。  
  但是单步调试时发现多了一个字符。  
  问题点数:20、回复次数:11Top

1 楼skyonline(山中过客)回复于 2002-09-30 15:29:00 得分 10

memcpy(Drive,(LPCSTR)str,str.GetLength());  
  后面的可以不要了吧  
  Top

2 楼webber84(***闭关修炼中***)回复于 2002-09-30 15:51:27 得分 0

Drive[3]=0用不着。Top

3 楼webber84(***闭关修炼中***)回复于 2002-09-30 15:52:14 得分 0

Drive[3]=0用不着。Top

4 楼zhi_liu6(野战炮)回复于 2002-09-30 16:00:21 得分 0

strcpy(Drive,   str.GetBuffer(0));Top

5 楼oldworm(oldworm)回复于 2002-09-30 16:15:16 得分 10

strcpy(Drive,(LPCTSTR)str);      
  这一行出错了,因为strcpy不检测缓冲长度,应该这样:  
  strncpy(Drive,   (LPCTSTR)str,   sizeof(Drive));  
  Drive[sizeof(Drive)   -1]   =   0;  
  建议不要直接写Drive[3]   =   0;用Drive[sizeof(Drive)   -1]   =   0比较好,这样你即使修改了Drive的定义也没有关系,否则,你还要修改代码,而这往往容易被忽略造成隐含问题。  
  Top

6 楼oldworm(oldworm)回复于 2002-09-30 16:21:13 得分 0

to     skyonline(山中过客)   、   webber84(***闭关修炼中***)、   zhi_liu6(野战炮)   :  
  你们都错了,没有搞清楚问题的本质,请看我的解释。  
   
  Top

7 楼zhi_liu6(野战炮)回复于 2002-09-30 16:23:35 得分 0

我的100%没有问题!!!Top

8 楼devil97518(天使也会疯)回复于 2002-09-30 16:30:10 得分 0

gz  
  oldworm   is   goodTop

9 楼core(猪母狼马)回复于 2002-09-30 16:32:19 得分 0

你的代码原样贴出来Top

10 楼webber84(***闭关修炼中***)回复于 2002-09-30 17:01:22 得分 0

to   oldworm(oldworm):  
        据我所知,当在源串中遇到'\0'的时候,strcpy的复制操作就结束了。也就是说,只要目标串空间足够大,并且源串中有'\0',就不会有非法操作的问题.下面一段代码是CString::AllocBuffer的一部分,CString正是用这个函数来分配内存的:  
  pData   =   (CStringData*)new   BYTE[sizeof(CStringData)   +   (nLen+1)*sizeof(TCHAR)];  
  pData->nAllocLength   =   nLen;  
  pData->nRefs   =   1;  
  pData->data()[nLen]   =   '\0';  
  pData->nDataLength   =   nLen;  
  m_pchData   =   pData->data();  
  你可以看到,CString其实总是在串的结尾处加一个结束标记'\0'。也就是说,当你用GetLength返回5时,CString其实分配了6个字节的内存(这里我就不算sizeof(CStringData)了).  
      回到楼主的代码,   Drive一共4个字节,而str的字符长度其实也是4个字节(最后有一个'\0')。所以我想这种情况下用strcpy是不会出错的,这也是我说Drive[3]=0用不着的原因。Top

11 楼webber84(***闭关修炼中***)回复于 2002-09-30 17:08:06 得分 0

并且,楼主的代码在我这里运行一点问题都没有。Top

12 楼rushing(勇敢的心)回复于 2002-09-30 17:32:54 得分 0

多谢各位。  
  这段代码的目的是从一个目录中将驱动器盘符取出来。  
  例如,  
  m_Dir="c:\Windows"  
  那么  
  Drive="c:\"  
  如果改成Drive[4]确实不会出错。  
  但是会变成  
  Drive="c:\w"  
  楼上有几位高手已经解答的很好了。  
  我用不同的办法也解决了,但是还会实验一下诸位的代码。  
  谢谢了!  
  Top

相关问题

  • CString 与char的转化问题
  • CString怎样转化成char?
  • 如何将CString转化为char*类型?
  • 怎么把一个CString 转化为 char *
  • 怎样把char型转化为CString型
  • 怎么把CString转化成char型
  • CString转化为const char*的问题
  • 如何在CString和char* ,char[]之间转化?
  • 请问CString,char*,char var[],三者之间如何转化
  • CString与char*

关键词

  • 代码
  • drive
  • pdata
  • 出错
  • cstring
  • nlen
  • strcpy
  • cstringdata
  • 问题
  • lpctstr

得分解答快速导航

  • 帖主:rushing
  • skyonline
  • oldworm

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo