正在阅读:VC++学习:字符串黑箱的背后VC++学习:字符串黑箱的背后

2004-03-01 10:18 出处:CSDN 作者:titilima 责任编辑:linjixiong

  wsprintf(szByte, "%02X", lpbySrc[i]);
  lstrcpy(&lpDst[j], szByte);
  free(lpbySrc);
  lpbySrc = NULL;
  CloseHandle(hFileSrc);
  // 保存到目标文件
  hFileDst = CreateFile(szFileDst, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
  WriteFile(hFileDst, (LPCVOID)lpDst, lstrlen(lpDst) * sizeof(TCHAR), &dwReaded, NULL);
  free(lpDst);
  lpDst = NULL;
  CloseHandle(hFileDst);
  }
  按说代码写到这里也就该结束了,不过这个话题的确值得就此说开去——可以说,导致上文这种麻烦的“罪魁”,就是C-style string本身的“零结尾”机制。那么我再列出一段代码以供诸位一品:
  void CString::ConcatCopy(int nSrc1Len, LPCTSTR lpszSrc1Data, int nSrc2Len, LPCTSTR lpszSrc2Data)
  {
  // -- master concatenation routine
  // Concatenate two sources
  // -- assume that 'this' is a new CString object

  int nNewLen = nSrc1Len + nSrc2Len;
  if (nNewLen != 0)
  {
  AllocBuffer(nNewLen);
  memcpy(m_pchData, lpszSrc1Data, nSrc1Len*sizeof(TCHAR));
  memcpy(m_pchData+nSrc1Len, lpszSrc2Data, nSrc2Len*sizeof(TCHAR));
  }
  }
  如你所见,这是MFC Framework中的CString源码片断。CString为了避免寻找结尾可能造成的尴尬,它的连接函数使用了memcpy而不是strcat/lstrcat,并且由参数给定的字串长度直接确定了字串的尾部位置。那么,可以用CString::operator+=来完成上边的操作吗?

  答案还是不可以。我的确说过CString避免了寻找结尾的尴尬,但是CString却带来了另外一个尴尬——重复复制的尴尬。CString::operator+=归根结底是调用了上边的CString::ConcatCopy,并且调用一次CString::ConcatCopy就意味着调用memcpy两次,所以用CString::operator+=则是更得不偿失的一种方法。

  无论是C的字符串处理函数还是用C++构造的字符串类,都可以看作是一种“黑箱”。在一般情况下,用户无需了解黑箱内部的实现机理,只要假设“黑箱”是完美的并直接使用就可以了。然而事实上黑箱本身并不是完美万能的——即使这种黑箱是C/C++标准库,也许令你摸不着头脑的错误,就隐藏在那看似完美的黑箱背后。

 

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品