char 与 CString转化的问题。
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




