来源:远方网络 | 2006-1-6 | (有2562人读过)
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 - 子字符串间的分隔字符,默认为'\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(*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; } ///////////////////////////////////////////////// //////////////////////////////////////////////// ///
|