GetBuffer(0)是什么意思?

RedWolf1999 2005-08-24 02:01:39
CString str;
str += char(m_strUser.GetLength());
str += m_strUser;
str += char(m_strPass.GetLength());
str += m_strPass;
TRACE("CURRENT STR IS:%s",str);
char* buf = str.GetBuffer(0); ???这句不明白?我的理解是得到str内字符串的首地址.

CURRENT STR IS:ware11111

调试的时间TRACE输出的是上面的那东西.不明白.请注册看ware和11111前面的那奇怪的东西.这是怎么回事啊?
...全文
3131 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzh0591 2005-08-29
  • 打赏
  • 举报
回复
这两天我在看关于COM的著作,里面经常用到这个函数,我研究后得出的结论与sunmz_wjxy(孙大圣)论述基本相同。但有一点我想强调一下,CString对象和LPTSTR指针可以任意转换。
wzh0591 2005-08-25
  • 打赏
  • 举报
回复
TO:lianglp
CString str1 = "Demo";
CString str2 = str1;
这样的话,实际上str2指向的地址也是str1指向的字符串地址空间,只是引用计数器加了1。

楼上的这句不对,这时str2是指向内存中的另外一个地址,因为CString str2 = str1;调用的是CString类的默认拷贝构造函数。至于楼主说的GetBuffer(0),我是没见过这种用法,能否告知其使用的上下文。我个人理解是:“这可能是一个空串,对于CString类而言,字符串的结束标志'\0'是自动加上的,且不计入长度。”欢迎指正。
RedWolf1999 2005-08-25
  • 打赏
  • 举报
回复
楼上的,这个代码是我在学网络编程时下载的例子中的一段,正因为看不懂,想不明白才放在这里求教啊。
如果你想看的话,留个信箱我把这套代码给你发过去啊。
gohappy_1999 2005-08-25
  • 打赏
  • 举报
回复
sunmz_wjxy 2005-08-25
  • 打赏
  • 举报
回复 1
我的观点是:
如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。 如果你只是打算修改字符或者截短字符串,你完全可以这样做:

CString s(_T("File.ext"));
LPTSTR p = s.GetBuffer();
LPTSTR dot = strchr(p, ''.''); // OK, should have used s.Find...
if(p != NULL)
*p = _T(''\0'');
s.ReleaseBuffer();
  这是 GetBuffer 的第一种用法,也是最简单的一种,不用给它传递参数,它使用默认值 0,意思是:“给我这个字符串的指针,我保证不加长它”。当你调用 ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入 CString 对象中。
  必须强调一点,在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为 ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。研究以下代码:

CString s(...);

LPTSTR p = s.GetBuffer();

//... 这个指针 p 发生了很多事情

int n = s.GetLength(); // 很糟D!!!!! 有可能给出错误的答案!!!

s.TrimRight(); // 很糟!!!!! 不能保证能正常工作!!!!

s.ReleaseBuffer(); // 现在应该 OK

int m = s.GetLength(); // 这个结果可以保证是正确的。

s.TrimRight(); // 将正常工作。
  假设你想增加字符串的长度,你首先要知道这个字符串可能会有多长,好比是声明字符串数组的时候用:

char buffer[1024];
表示 1024 个字符空间足以让你做任何想做得事情。在 CString 中与之意义相等的表示法:

LPTSTR p = s.GetBuffer(1024);
  调用这个函数后,你不仅获得了字符串缓冲区的指针,而且同时还获得了长度至少为 1024 个字符的空间(注意,我说的是“字符”,而不是“字节”,因为 CString 是以隐含方式感知 Unicode 的)。
  同时,还应该注意的是,如果你有一个常量串指针,这个串本身的值被存储在只读内存中,如果试图存储它,即使你已经调用了 GetBuffer ,并获得一个只读内存的指针,存入操作会失败,并报告存取错误。我没有在 CString 上证明这一点,但我看到过大把的 C 程序员经常犯这个错误。

RedWolf1999 2005-08-25
  • 打赏
  • 举报
回复
楼上的,右键点击那个函数选择:GotoDefination就转到定义了。
Snow_Ice11111 2005-08-25
  • 打赏
  • 举报
回复
To: lianglp()
麻烦请告诉小弟如何才能看到MFC中的源代码?我用F12键只能看到函数的原型,无法看见相关的代码。
曾见到有人把系统函数的源代码贴了上来,所以很想知道啊!!
lianglp 2005-08-24
  • 打赏
  • 举报
回复
CString str1 = "Demo";
CString str2 = str1;
这样的话,实际上str2指向的地址也是str1指向的字符串地址空间,只是引用计数器加了1。
当调用GetBuffer()时,则函数先自动申请一个新的长度,这个长度如在参数中指定为0,则
申请新的长度就跟以前的长度相等,然后把以前的字符串复制到新申请的内存,最后把指向
以前的字符串所属的引用计数器减1。
ReleaseBuffer()也有相同的这个作用,只是它还可以减少字符串的长度,其实只是根据传递
参数加上一个[\0]字符串结束标志而已。


具体看一下MFC源程序吧。
亿云力科技 2005-08-24
  • 打赏
  • 举报
回复
学习。。。
谁来详细解释一下GetBuffer(0)是什么意思,结合GetBuffer和ReleaseBuffer
真糨糊 2005-08-24
  • 打赏
  • 举报
回复
CString::GetBuffer
LPTSTR GetBuffer( int nMinBufLength );

nMinBufLength

The minimum size of the character buffer in characters. This value does not include space for a null terminator.

windcsn 2005-08-24
  • 打赏
  • 举报
回复
返回字符穿的最小长度是0

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧