MFC中有幾個字符串操作函數很有用,但有的在MSDN中都查不到,因為MSDN沒有公布。下面我們來看看它們的用法和聲明及定義等。// 功能 : 格式化字符串
// 參數 : rString - 輸出參數,格式化後的字符串將保存在此字符串中
// nIDS - 將進行替換操作的格式字符串的資源ID
// lpsz1 - 指向將替換格式字符串中“%1”字符的字符串
// lpsz2 - 指向將替換格式字符串中“%2”字符的字符串
void AFXAPI AfxFormatString1(CString& rString, UINT nIDS, LPCTSTR lpsz1);
void AFXAPI AfxFormatString2(CString& rString, UINT nIDS, LPCTSTR lpsz1, LPCTSTR lpsz2);
// Implementation string helpers
void AFXAPI AfxFormatStrings(CString& rString, UINT nIDS, LPCTSTR const* rglpsz, int nString);
void AFXAPI AfxFormatStrings(CString& rString, LPCTSTR lpszFormat, LPCTSTR const* rglpsz, int nString);
// 功能 : 獲取子字符串
// 參數 : rString - 輸出參數,保存子字符串
// lpszFullString - 源字符串
// iSubString - 子字符串索引,從0開始計數
// chSep - 子字符串間的分隔字符,默認為
BOOL AFXAPI AfxExtractSubString(CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep =
);
/////////////////////////////////////////////////
////////////////////////////////////////////////
///
// Strings in format ".....%1 .... %2 ...." etc. void AFXAPI AfxFormatStrings(CString& rString, UINT nIDS,
LPCTSTR const* rglpsz, int nString)
{
TCHAR szFormat[256];
if (!AfxLoadString(nIDS, szFormat) != 0)
{
TRACE1("Error: failed to load AfxFormatString string 0x%04x.
", nIDS);
ASSERT(FALSE);
return;
}
AfxFormatStrings(rString, szFormat, rglpsz, nString);
}
void AFXAPI AfxFormatStrings(CString& rString, LPCTSTR lpszFormat,
LPCTSTR const* rglpsz, int nString)
{
// 計算結果字符串的長度
int nTotalLen = 0;
LPCTSTR pchSrc = lpszFormat;
while (*pchSrc != )
{
if (pchSrc[0] == % &&
( (pchSrc[1] >= 0 && pchSrc[1] <= 9) ||
(pchSrc[1] >= A && pchSrc[1] <= Z)) )
{
// %A comes after %9 -- well need it someday
int i;
if (pchSrc[1] >9)
i = 9 + (pchSrc[1] - A);
else
i = pchSrc[1] - 1;
pchSrc += 2;
if (i >= nString)
++nTotalLen;
else if (rglpsz[i] != NULL)
nTotalLen += lstrlen(rglpsz[i]);
}
else
{
if (_istlead(*pchSrc))
++nTotalLen, ++pchSrc;
++pchSrc;
++nTotalLen;
}
}
pchSrc = lpszFormat;
LPTSTR pchDest = rString.GetBuffer(nTotalLen);
while (*pchSrc != )
{
if (pchSrc[0] == % &&
( (pchSrc[1] >= 0 && pchSrc[1] <= 9) ||
(pchSrc[1] >= A && pchSrc[1] <= Z)) )
{
// %A comes after %9 -- well need it someday
int i;
if (pchSrc[1] >9)
i = 9 + (pchSrc[1] - A);
else
i = pchSrc[1] - 1;
pchSrc += 2;
if (i >= nString)
{
TRACE1("Error: illegal string index requested %d.
", i);
*pchDest++ = ?;
}
else if (rglpsz[i] != NULL)
{
lstrcpy(pchDest, rglpsz[i]);
pchDest += lstrlen(pchDest);
}
}
else
{
if (_istlead(*pchSr
c)) // *pchSrc是否多字節字符的首字節
*pchDest++ = *pchSrc++; // 拷貝首字節
*pchDest++ = *pchSrc++;
}
}
rString.ReleaseBuffer((int)((LPCTSTR)pchDest - (LPCTSTR)rString));
// ReleaseBuffer will assert if we went too far
}
void AFXAPI AfxFormatString1(CString& rString, UINT nIDS, LPCTSTR lpsz1)
{
AfxFormatStrings(rString, nIDS, &lpsz1, 1);
}
void AFXAPI AfxFormatString2(CString& rString, UINT nIDS, LPCTSTR lpsz1,
LPCTSTR lpsz2)
{
LPCTSTR rglpsz[2];
rglpsz[0] = lpsz1;
rglpsz[1] = lpsz2;
AfxFormatStrings(rString, nIDS, rglpsz, 2);
}
BOOL AFXAPI AfxExtractSubString(CString& rString, LPCTSTR lpszFullString,
int iSubString, TCHAR chSep)
{
if (lpszFullString == NULL)
return FALSE;
while (iSubString--)
{
lpszFullString = _tcschr(lpszFullString, chSep);
if (lpszFullString == NULL)
{
rString.Empty(); // return empty string as well
return FALSE;
}
lpszFullString++; // point past the separator
}
LPCTSTR lpchEnd = _tcschr(lpszFullString, chSep);
int nLen = (lpchEnd == NULL) ? lstrlen(lpszFullString) : (int)(lpchEnd - lpszFullString);
ASSERT(nLen >= 0);
memcpy(rString.GetBufferSetLength(nLen), lpszFullString, nLen*sizeof(TCHAR));
return TRUE;
}
/////////////////////////////////////////////////
////////////////////////////////////////////////
///