CString 中明明有值,但GetLength为何返回0, IsEmpty 为何是TRUE?

好久没有写。。TMD碰到大坑,实在忍不住吐槽前任。

碰到了白痴写的代码如下:

    CString strGet,strKey;
    strGet.Empty();

    strKey = _T("Mode");
    GetPrivateProfileString(_T("COMM"),strKey,_T("default"),strGet.GetBuffer(512),512,strConfigFilePath);
    m_strCommMode = strGet;

    strKey = _T("Serial");
    GetPrivateProfileString(_T("COMM"),strKey,_T("default"),strGet.GetBuffer(512),512,strConfigFilePath);
    ......

觉得万般别扭,果然在我后来调试时,发现了问题:

m_strCommMode 中明明有值,但GetLength为何返回0, IsEmpty 为何是TRUE?

因是生产环境,就 MessageBox/写日志查看里面的值,发现都是正常,但TMD,GetLength为何总返回0, IsEmpty 为何总是TRUE?

单步调试后,才发现问题就是上面的GetBuffer()出现了问题,记住了:蛋炒饭必须要用隔夜饭炒,CString的GetBuffer也必须要和ReleaseBuffer配对使用!!!!!理由如下:


我们来看看MFC中ReleaseBuffer的代码:

     void ReleaseBuffer( int nNewLength = -1 )
     {
          if( nNewLength == -1 )
          {
               nNewLength = StringLength( m_pszData );
          }
          SetLength( nNewLength );
     }
很明显ReleaseBuffer只有一个作用,就是更新字符串的长度。CString内,GetLength获取字符串长度并不是动态计算的,而是在赋值操作后计算并保存在一个int变量内的,当通过GetBuffer直接修改CString时,那个int变量并不可能自动更新,于是便有了ReleaseBuffer。
因此以上代码加上s.ReleaseBuffer();后再s.GetLength()就OK了。

最后,或许是洁癖,实在忍不住,按我自己的套路来改写了一下: 明明可以不用CString的啊!!

TCHAR szTemp[512];
memset( szTemp, 0, sizeof(szTemp) );
GetPrivateProfileString(_T("COMM"),_T("Mode"),_T("COM"), szTemp,512,strConfigFilePath);
m_strCommMode = szTemp;

m_nCommPort = GetPrivateProfileInt(_T("COMM"),_T("Serial"), 0, 512,strConfigFilePath);

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: CString 是 C++ 的一个字符串类,是 MFC (Microsoft Foundation Class) 库提供的一个字符串类。它是 STL string 的一个替代品,主要用于 Windows 应用程序开发。CString 提供了许多便捷的操作,如字符串拼接、查找、替换等,可以大大简化字符串处理的工作。 ### 回答2: CString是C++的一个类,用于处理字符串。它是MFC(Microsoft Foundation Class)库的一部分,为程序员提供了一种方便的方式来处理字符串操作。 CString类封装了一系列字符串操作的功能,例如字符串的复制、连接、截取、搜索等。它提供了许多成员函数来进行这些操作,使得字符串的处理更加简洁和高效。 与C风格字符串相比,CString类具有许多优势。首先,它提供了自动的内存管理,可以动态地分配和释放内存,不需要手动管理字符串的长度和存储空间。其次,CString类支持许多便捷的操作符重载和成员函数,使得字符串的操作更加方便和直观。此外,CString还提供了对Unicode字符集的支持,可以处理多语言环境下的字符串。 使用CString类,可以很方便地创建、修改和处理字符串。程序员可以通过调用成员函数来进行字符串操作,而不需要自己编写复杂的代码来处理字符串的内存分配和释放。CString类在MFC框架被广泛应用,特别适用于Windows环境下的图形界面程序开发。 总之,CString是一个功能强大的字符串类,在C++提供了便捷高效的字符串处理方式,使得程序员可以更加方便地操作和管理字符串。 ### 回答3: CString是一种C++的字符串类,它是对标准C库的字符数组的封装。CString通过提供一系列成员函数来简化对字符串的操作,包括拷贝、连接、查找、插入等功能。CString的实现基于动态内存分配,可以根据需要自动调整字符串的长度。它还提供了方便的成员函数来进行字符串的格式化和转换,方便进行数字与字符串之间的转换操作。 CString具有很多特性,比如自动释放内存、自动管理字符串长度、支持Unicode字符集、提供了大量的操作字符串的方法等。它还可以与其他字符串类和字符类型进行相互转换,方便与其他C++标准库的数据结构和函数进行交互。CString还支持重载运算符,使得字符串对象可以使用类似于普通字符数组的方式进行操作。 在使用CString时,需要包含MFC头文件,因为它基于Windows的MFC(Microsoft Foundation Classes)框架。通过使用CString,开发人员可以更方便地进行字符串的处理和操作,提高开发效率。由于它是对底层C库的封装,所以在性能上可能不如直接使用字符数组,但在开发C++ MFC应用程序时,CString提供了更高级、更便利的接口,简化了字符串处理的工作,降低了开发难度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

allenq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值