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,我是菜鸟,所以才问了这么弱弱的问题,不知道哪位大虾能帮忙解释一下,这个程序有什么问题?

解决方案 »

  1.   

    CString这么用是错误的,而且很危险。
      

  2.   

    CString 是一个MFC类,应该按照类的方法和属性进行操作
    CString 被构造的时候,有一个初始存储空间,64字节,但是长度属性为0_tcscpy不是CString的方法
    你的赋值没有出现问题,是因为 _T("Hello");没有超过64字节
    如healer_kx(http://healerkx.spaces.live.com/)所说,你那样用法很危险,可能使程序崩溃
      

  3.   

    CString这么用是错误的,而且很危险。
    ===================
    如何危险啊?小弟愚钝,望解释清楚点
      

  4.   

    缓存区越界,当CString并没有分配那么大的存储空间时,你试图拷贝很长的字符串,你可以自己测试一下,拷贝超过64字节或者更长的字符串:)
      

  5.   

    缓存区越界,当CString并没有分配那么大的存储空间时,你试图拷贝很长的字符串,你可以自己测试一下,拷贝超过64字节或者更长的字符串:)
    =================================
    我把Hello换成了Helloaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,也能打印出Helloaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,但是length还是0,郁闷啦!
      

  6.   

    越界的错误并不是每次都使程序崩溃,否则就不是错误,也没有危险了
    你的用法在某些特定的环境下,数据会覆盖掉有效的数据,程序就完蛋了
    CString S;
    CString S1("1234");
    你可以在S后面申请几个其他变量,然后看看是否被覆盖
      

  7.   

    int a = ((CString)str).GetLength(); //这样就可以了
    可能强制转换中丢失了信息。
    GetStr()实际上返回的str是一个LPCTSTR
      

  8.   

    我按照 lfchen(一条晚起的虫) 的方法做了,得到的结果是正确的,但是为什么还要进行一次类型转换呢,我本来就定义的是CString类型的啊?ok1234567(ok1234567) 说的我能明白,但是总觉得不能很清楚地解释我这个程序的错误?
      

  9.   

    CString里面包含一个字符串指针,指向的是存放字符串的地址
    如果用_tcscpy,确实把内容放到了指针指向的位置但问题是,这个指针地址的前面,还有其它的内容,包括字符串长度、分配的空间长度
    如果你copy的字符串超过分配空间的长度,肯定会出问题
    而且用GetLength()取得字符串长度时,并不重新计算字符串长度,而是直接取过来就行了
      

  10.   

    to:wenbo_ying(应),那为什么强制转换为CString后就可以了呢?
      

  11.   

    CString类中,length是它的一个属性,初始化的时候为0
    该属性只有在你使用CString提供的操作方法,比如=,+=才会改变值
    strcpy不是CString 的成员变量,但是你可以用这个函数向你获得的CString成员数据--str缓冲区指针(LPCTSTR)写数据,但是表示长度的属性变量不会改变
    CString 的GetLength()方法只是简单返回其内部的变量length的值,那个从来没有改变过的值正确的操作应该是
    LPTCTSTR 返回静态指针,只能对于数据进行读操作,你要强制转化为动态,然后写,也是可以的,但不能越界,且CString类不会跟踪信息的变量,这样使用CString 不好
    如果要写,应该使用
    LPTSTR p = s.GetBuffer( 10 );
    strcpy( p, "Hello" );  
    s.ReleaseBuffer( );
      

  12.   

    to:wenbo_ying(应),那为什么强制转换为CString后就可以了呢?强制转换为CString是临时重新构造了一个CString类实例,并赋值,这样的开销对于程序设计来说是性能损失
      

  13.   

    或者你改成
    void GetStr(CString& str)
    LPCTSTR 是const的,这个函数的声明就有问题了