// 功能 : 格式化字符串
// 参数 : 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 - 子字符串间的分隔字符,默认为’\n’
BOOL AFXAPI AfxExtractSubString CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep = ’\n’);
////////////////////////////////////////////////////////////////////////////////////////////////////
// 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.\n", 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 != ’\0’)
{
if pchSrc[0] == ’%’ &&
pchSrc[1] >= ’0’ && pchSrc[1] <= ’9’) ||
pchSrc[1] >= ’A’ && pchSrc[1] <= ’Z’)) )
{
// %A comes after %9 -- we’ll 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 != ’\0’)
{
if pchSrc[0] == ’%’ &&
pchSrc[1] >= ’0’ && pchSrc[1] <= ’9’) ||
pchSrc[1] >= ’A’ && pchSrc[1] <= ’Z’)) )
{
// %A comes after %9 -- we’ll 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.\n", i);
*pchDest++ = ’?’;
}
else if rglpsz[i] != NULL)
{
lstrcpy pchDest, rglpsz[i]);
pchDest += lstrlen pchDest);
}
}
else
{
if _istlead *pchSrc)) // *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;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
|