// 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
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
解决方案 »
- ecplise中安装android插件总有警告
- directshow开发中filter内部如何截获应用程序拖动进度条时发过来的消息
- GDI+ 通过DrawImage函数显示的图片在进行窗口切换后显示消失,有何解决方法?
- 关于CSplitterWnd分割视图后的问题
- 用gd+ bitmap 如何将一张大图存为按比例缩小的一张小图,请高手赐教!
- 关于坐标的初始化与提取
- 大哥们,救命啊!!没人教我就死定了!!!5555
- 深入浅出MFC的一个小问题,高人指点
- 为什全局变量的字符串缓冲区不能被写入[求助]
- VC++怎样对时间(非字符型)数据进行帮定的!!!
- 基类不小心写错了怎么办?
- 关于createtoolhelp32sanpshot的不明白之处
strcpy( p, "Hello" ); // directly access CString buffer
你这样使用本变来就是不对的.
因为CString的内存空间是由CString类自己的管理的,你在不知道它内存空间多的情况下就strcpy进它里里,很容易访问越界,导致程序崩溃.还有LPTSTR是一个不定类型,如果在多语言编译环境,就是char* 在UNICODE编译环境则是 wchar,如果你是VS,可能标准WINDOWS程序默认是UNICODE的,这是LPTSTR就是 wchar ,但是strcpy第一个参数是char*,所以就会提示你说的那个错误了
不过注意strcpy是ANSI函数,在Unicode下可能会出错(VS2005下默认),而且它有很大的安全隐患,一旦遇到无结尾字符串或者重叠内存区域时就会有致命问题。建议你改用StringCchCopy,至少也应该用_tcscpy_s,它们都能自动适应ANSI和Unicode,你看到的MSDN可能是较早编写的。
========
你是不是应该将出错信息先贴出来呢?
如果你用是VS2005的话,最大的可能是UNICODE的原因
#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