// example for CString::GetBuffer
CString s( "abcd" );
#ifdef _DEBUG
afxDump << "CString s " << s << "\n";
#endif
LPTSTR p = s.GetBuffer( 10 );
strcpy( p, "Hello" );   // directly access CString buffer
s.ReleaseBuffer( );
#ifdef _DEBUG
afxDump << "CString s " << s << "\n";
#endif
这段程序怎么才能编译通过呢?
http://msdn.microsoft.com/en-us/library/aa314880(VS.60).aspx

解决方案 »

  1.   

    你要建立一个支持MFC连接库的程序,最简单的建一个MFC工程,然后代码拷到合适的位置,LZ如果不知道MFC还是先学一学MFC程序设计吧,看个入门的这个代码也就懂了
      

  2.   

    我从来不用GetBuffer,因为我不会用
      

  3.   

    为什么strcpy在WINDOWS标准库下说第一个参数要char *报错,在MFC下就不报了呢
      

  4.   

    LPTSTR p = s.GetBuffer( 10 );
    strcpy( p, "Hello" );   // directly access CString buffer
    你这样使用本变来就是不对的.
    因为CString的内存空间是由CString类自己的管理的,你在不知道它内存空间多的情况下就strcpy进它里里,很容易访问越界,导致程序崩溃.还有LPTSTR是一个不定类型,如果在多语言编译环境,就是char* 在UNICODE编译环境则是 wchar,如果你是VS,可能标准WINDOWS程序默认是UNICODE的,这是LPTSTR就是 wchar ,但是strcpy第一个参数是char*,所以就会提示你说的那个错误了
      

  5.   

    GetBuffer的意思就是停止CString对字符串的自动维护操作,把它转换成可以通过LPTSTR这样的指针直接操纵的TCHAR[]数组,它的参数的意思是要保留多少字节作为缓冲区,因为字符串大小可能会变化,变化后长度不能超过那个参数。如果直接GetBuffer(0),就是代表承诺不会去改变其字符串长度,如果不遵守这个约定的话可能会导致数据溢出。ReleaseBuffer就是恢复自动维护机制。
    不过注意strcpy是ANSI函数,在Unicode下可能会出错(VS2005下默认),而且它有很大的安全隐患,一旦遇到无结尾字符串或者重叠内存区域时就会有致命问题。建议你改用StringCchCopy,至少也应该用_tcscpy_s,它们都能自动适应ANSI和Unicode,你看到的MSDN可能是较早编写的。
      

  6.   

    这段程序怎么才能编译通过呢?
    ========
    你是不是应该将出错信息先贴出来呢?
    如果你用是VS2005的话,最大的可能是UNICODE的原因
      

  7.   

    编码问题,可能你的编码是Unicode的,修改成下面这样就可以了CString s(_T("abcd"));
    #ifdef _DEBUG
    afxDump << _T("CString s ") << s << _T("\n");
    #endif
    LPTSTR p = s.GetBuffer( 10 );
    _tcscpy( p, _T("Hello"));   // directly access CString buffer
    s.ReleaseBuffer( );
    #ifdef _DEBUG
    afxDump << _T("CString s ") << s << _T("\n");
    #endif