Rover12421's Blog

The End.

扩展std::string功能的几个做法

作者:朱金灿
来源:http://blog.csdn.net/clever101/

      std::string毫无疑问是一个很强大的字符串类,但比起MFC的CString类,也存在一些不足,比如字符串的大小写转换以及格式化字符串。这次我介绍一下std::string大小写转换的两个函数以及格式化std::string的两种做法。

   1: /*!  
   2: *  \brief 将字符串中的大写字母变为小写。  
   3: *  
   4: *  \param SrcString [in&out]源字符串。  
   5: *  \return 无。  
   6: */  
   7: static void string_ToLower(string &SrcString)   
   8: {   
   9:     for (string::iterator i = SrcString.begin(); i != SrcString.end(); i++)   
  10:         if (*i >= 'A' && *i <= 'Z')   
  11:             *i = (*i) + ('a' - 'A');   
  12: }   
  13: /*!  
  14: *  \brief 将字符串中的小写字母变为大写。  
  15: *  
  16: *  \param SrcString [in&out]源字符串。  
  17: *  \return 无。  
  18: */  
  19: static void string_ToUpper(string &SrcString)   
  20: {   
  21:     for (string::iterator i = SrcString.begin(); i != SrcString.end(); i++)   
  22:         if (*i >= 'a' && *i <= 'z')   
  23:             *i = (*i) - ('a' - 'A');   
  24: }  

       CString中的format函数让人使用起来非常舒服。std::string如何实现格式化字符串呢?通过搜索网上资料,我找到了两种办法:

法一:利用std::ostringstream类,具体做法如下例:

   1: #include <sstream>
   2: TCHAR szName[] = _T("Windows");
   3: int nWidth = 100;
   4: int nHeight= 100;
   5: float fArea = 10000.7;
   6: std::ostringstream stm;
   7: std::string strResult;
   8: stm <<_T("窗口名称:")<<szName <<_T(",长为")<< nWidth << _T(",高为") << nHeight<<_T(",面积为")<<fArea;
   9: strResult = stm.str();
  10: std::cout<<strResult<<std::endl;

法二:利用Boost Format library,具体如下例

   1: #include  "boost\format.hpp"
   2:   int nAge = 15;
   3:   TCHAR szAddress[] = _T("广州");
   4:   string strResult2 = boost::str(boost::format("我今年%d岁,住在%s")%nAge%szAddress);

     boost::format的基本语法结构为:format(需要格式化的字符串 ) %参数1 %参数2 …%参数n。具体用法参考:Boost 库之format的使用 。

另外网上有人基于std::string实现了一个ext_string,提供一些常用的功能,例如:

  1. 定义分隔符。给定分隔符,把string分为几个字段。

  2. 提供替换功能。例如,用winter, 替换字符串中的wende

  3. 大小写处理。例如,忽略大小写比较,转换等

  4. 整形转换。例如把"123"字符串转换为123数字。

具体你可以看看:Extended STL string 。我个人感觉似乎不必使用一个派生类,需要哪个功能就单独用一个静态函数似乎更为灵活。

本文来自CSDN博客:http://blog.csdn.net/clever101/archive/2010/04/18/5499414.aspx

Comments