VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 839|回复: 2

[原创] 关于C++中string的一些辅助扩展函数

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2017-8-22 17:58:18 | 显示全部楼层 |阅读模式
最近的几个项目中用到了很多C++标准模板库STL里面的类/容器之类的,最常用的就是字符串 string,其基本的一些用法都还可以,但是遇到了几个 string 没有实现,但是还很常用的操作,比如:
字符串根据某个关键字符进行拆分,字符串的格式化输入,字符串的 trim 等操作,这些 string 都没有提供。每当此时就想起了 MFC 中的 CString 和 AtlString 的方便之处,但是有时候又不想转来转去的,而且部分工程还不支持MFC,没办法只能自己动手,丰衣足食了。这里找到了一些不错的关于以上几个操作的 string 实现,加上自己的修改封装了几个小函数发出来供大家使用!

1、string 的字符串分割:
  1. void split(string str, string pattern, vector<string>& arrout)
  2. {
  3.         arrout.clear();
  4.         size_t idx = 0, pos = 0;
  5.         size_t size = str.size();
  6.         for (idx = 0; idx < size; ++idx)
  7.         {
  8.                 pos = str.find(pattern, idx);
  9.                 if (pos != string::npos)
  10.                 {
  11.                         string s = str.substr(idx, pos - idx);
  12.                         if (s.size() > 0) arrout.push_back(s);
  13.                         idx = pos + pattern.size() - 1;
  14.                 }
  15.                 else
  16.                 {
  17.                         if (idx < size)
  18.                         {
  19.                                 string s = str.substr(idx, str.size() - idx);
  20.                                 if (s.size() > 0) arrout.push_back(s);
  21.                                 break;
  22.                         }
  23.                 }
  24.         }
  25. }
复制代码


第一个参数 str,代表源字符串,即要被分割的字符串;
第二个参数 pattern,代表分割符;
第三个参数 arrout,是传出参数,把分割好的子串放到这个 vector 容器中;

举个栗子:
  1. vector <string> arr_out;
  2. string str = "123#abc#222";
  3. split(str, "#", arr_out);
复制代码


2、string 字符串的格式化输入:
  1. string string_format(const string fmt, ...)
  2. {
  3.         string str;

  4.         int size = ((int)fmt.size()) * 2 + 50;   // Use a rubric appropriate for your code
  5.         va_list ap;
  6.         while (1) {     // Maximum two passes on a POSIX system...
  7.                 str.resize(size);
  8.                 va_start(ap, fmt);
  9.                 int n = vsnprintf((char *)str.data(), size, fmt.c_str(), ap);
  10.                 va_end(ap);
  11.                 if (n > -1 && n < size) {  // Everything worked
  12.                         str.resize(n);
  13.                         return str;
  14.                 }
  15.                 if (n > -1)  // Needed size returned
  16.                         size = n + 1;   // For null char
  17.                 else
  18.                         size *= 2;      // Guess at a larger size (OS specific)
  19.         }

  20.         return str;
  21. }
复制代码


举个栗子:
  1. string str_ret = string_format("%s = %d", "3+2=", 5);
复制代码

字符串 str_ret 的内容为:"3+2=5"

3、string 的 trim 操作:
  1. inline string& string_ltrim(string &str)
  2. {
  3.         if (str.empty()) return str;

  4.         str.erase(0, str.find_first_not_of(" \n\r\t"));
  5.         return str;
  6. }

  7. inline string& string_rtrim(string &str)
  8. {
  9.         if (str.empty()) return str;

  10.         str.erase(str.find_last_not_of(" \n\r\t") + 1);
  11.         return str;
  12. }

  13. inline string& string_trim(string &str)
  14. {
  15.         return string_ltrim(string_rtrim(str));
  16. }
复制代码



功能:可以去掉字符串开头或者结尾的:空格( )、回车符(\r)、换行符(\n)、制表符(\t)等;

以上吧,暂时就这些,如果大家手头还有其他比较不错的 string 扩展函数也可以发出来啊。比如:string 字符串的大小写转换,string 字符串的 reverse 反转 等等。




上一篇:用字符指针与字符串
下一篇:对象与this指针

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

16_avatar_middle
online_vip12 firefox 发表于 2017-8-22 18:15:39 | 显示全部楼层
这个不错,以后会经常用到,收了!多谢楼主

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

22_avatar_middle
在线会员 api163 发表于 2018-1-13 04:57:05 来自手机 | 显示全部楼层
这个真的不错

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-14 14:58

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表