程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> MFC中幾個有用的字符串操作函數

MFC中幾個有用的字符串操作函數

編輯:關於C語言

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;
}
/////////////////////////////////////////////////
////////////////////////////////////////////////
///

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved