MFC中几个有用的字符串操作函数

类别:VC语言 点击:0 评论:0 推荐:

// 功能 :    格式化字符串
// 参数 :    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;
}
////////////////////////////////////////////////////////////////////////////////////////////////////

本文地址:http://com.8s8s.com/it/it469.htm