void GetStr(LPCTSTR str)
{
LPCTSTR s = _T("Hello");
_tcscpy((TCHAR*)str, s);
}int main(int argc, char* argv[])
{
CString S;
GetStr(S);
TRACE(_T("%s\n"), S);
int length = S.GetLength(); return 0;
}上面这段代码能打印出Hello,但是得到的length为0,我是菜鸟,所以才问了这么弱弱的问题,不知道哪位大虾能帮忙解释一下,这个程序有什么问题?
{
LPCTSTR s = _T("Hello");
_tcscpy((TCHAR*)str, s);
}int main(int argc, char* argv[])
{
CString S;
GetStr(S);
TRACE(_T("%s\n"), S);
int length = S.GetLength(); return 0;
}上面这段代码能打印出Hello,但是得到的length为0,我是菜鸟,所以才问了这么弱弱的问题,不知道哪位大虾能帮忙解释一下,这个程序有什么问题?
解决方案 »
- 关于获取自身版本号
- 多线程需要不断调用同一个。obj中的函数,怎么样才能在多个cpu上并行运行这些线程
- QQ/TM视频还原顺利完成,放分
- CreateDialog 失败,GetLastError返回0 ,怎么回事?
- 请问如何得到操作系统显示正在使用的色深?
- 如何判断对方是否成功接收到通过socket发送的信息?
- 问一个全局变量的问题[送分]
- 做了一个播放器,如何双击文件后让影片以我的播器打开?
- 重名问题!!
- MessageBox()属API函数,在MSDN中也有他的解释,可是我怎么知道他是哪个.h包涵的?MSDN中又没有说明,怎么办?
- 关于list ctrl的问题:
- 求助:有没有判断窗口是否正在显示的函数?
CString 被构造的时候,有一个初始存储空间,64字节,但是长度属性为0_tcscpy不是CString的方法
你的赋值没有出现问题,是因为 _T("Hello");没有超过64字节
如healer_kx(http://healerkx.spaces.live.com/)所说,你那样用法很危险,可能使程序崩溃
===================
如何危险啊?小弟愚钝,望解释清楚点
=================================
我把Hello换成了Helloaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,也能打印出Helloaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,但是length还是0,郁闷啦!
你的用法在某些特定的环境下,数据会覆盖掉有效的数据,程序就完蛋了
CString S;
CString S1("1234");
你可以在S后面申请几个其他变量,然后看看是否被覆盖
可能强制转换中丢失了信息。
GetStr()实际上返回的str是一个LPCTSTR
如果用_tcscpy,确实把内容放到了指针指向的位置但问题是,这个指针地址的前面,还有其它的内容,包括字符串长度、分配的空间长度
如果你copy的字符串超过分配空间的长度,肯定会出问题
而且用GetLength()取得字符串长度时,并不重新计算字符串长度,而是直接取过来就行了
该属性只有在你使用CString提供的操作方法,比如=,+=才会改变值
strcpy不是CString 的成员变量,但是你可以用这个函数向你获得的CString成员数据--str缓冲区指针(LPCTSTR)写数据,但是表示长度的属性变量不会改变
CString 的GetLength()方法只是简单返回其内部的变量length的值,那个从来没有改变过的值正确的操作应该是
LPTCTSTR 返回静态指针,只能对于数据进行读操作,你要强制转化为动态,然后写,也是可以的,但不能越界,且CString类不会跟踪信息的变量,这样使用CString 不好
如果要写,应该使用
LPTSTR p = s.GetBuffer( 10 );
strcpy( p, "Hello" );
s.ReleaseBuffer( );
void GetStr(CString& str)
LPCTSTR 是const的,这个函数的声明就有问题了