|
最近的几个项目中用到了很多C++标准模板库STL里面的类/容器之类的,最常用的就是字符串 string,其基本的一些用法都还可以,但是遇到了几个 string 没有实现,但是还很常用的操作,比如:
字符串根据某个关键字符进行拆分,字符串的格式化输入,字符串的 trim 等操作,这些 string 都没有提供。每当此时就想起了 MFC 中的 CString 和 AtlString 的方便之处,但是有时候又不想转来转去的,而且部分工程还不支持MFC,没办法只能自己动手,丰衣足食了。这里找到了一些不错的关于以上几个操作的 string 实现,加上自己的修改封装了几个小函数发出来供大家使用!
1、string 的字符串分割:
- void split(string str, string pattern, vector<string>& arrout)
- {
- arrout.clear();
- size_t idx = 0, pos = 0;
- size_t size = str.size();
- for (idx = 0; idx < size; ++idx)
- {
- pos = str.find(pattern, idx);
- if (pos != string::npos)
- {
- string s = str.substr(idx, pos - idx);
- if (s.size() > 0) arrout.push_back(s);
- idx = pos + pattern.size() - 1;
- }
- else
- {
- if (idx < size)
- {
- string s = str.substr(idx, str.size() - idx);
- if (s.size() > 0) arrout.push_back(s);
- break;
- }
- }
- }
- }
复制代码
第一个参数 str,代表源字符串,即要被分割的字符串;
第二个参数 pattern,代表分割符;
第三个参数 arrout,是传出参数,把分割好的子串放到这个 vector 容器中;
举个栗子:
- vector <string> arr_out;
- string str = "123#abc#222";
- split(str, "#", arr_out);
复制代码
2、string 字符串的格式化输入:
- string string_format(const string fmt, ...)
- {
- string str;
- int size = ((int)fmt.size()) * 2 + 50; // Use a rubric appropriate for your code
- va_list ap;
- while (1) { // Maximum two passes on a POSIX system...
- str.resize(size);
- va_start(ap, fmt);
- int n = vsnprintf((char *)str.data(), size, fmt.c_str(), ap);
- va_end(ap);
- if (n > -1 && n < size) { // Everything worked
- str.resize(n);
- return str;
- }
- if (n > -1) // Needed size returned
- size = n + 1; // For null char
- else
- size *= 2; // Guess at a larger size (OS specific)
- }
- return str;
- }
复制代码
举个栗子:
- string str_ret = string_format("%s = %d", "3+2=", 5);
复制代码
字符串 str_ret 的内容为:"3+2=5"
3、string 的 trim 操作:
- inline string& string_ltrim(string &str)
- {
- if (str.empty()) return str;
- str.erase(0, str.find_first_not_of(" \n\r\t"));
- return str;
- }
- inline string& string_rtrim(string &str)
- {
- if (str.empty()) return str;
- str.erase(str.find_last_not_of(" \n\r\t") + 1);
- return str;
- }
- inline string& string_trim(string &str)
- {
- return string_ltrim(string_rtrim(str));
- }
复制代码
功能:可以去掉字符串开头或者结尾的:空格( )、回车符(\r)、换行符(\n)、制表符(\t)等;
以上吧,暂时就这些,如果大家手头还有其他比较不错的 string 扩展函数也可以发出来啊。比如:string 字符串的大小写转换,string 字符串的 reverse 反转 等等。 |
上一篇: 用字符指针与字符串下一篇: 对象与this指针
|