当前位置: 首页 > news >正文

C++实现字符串 trim,C++实现字符串split, C++如何分割字符串为数组,C++如何去除字符串两边的空格

C++ 开发时,一般都会用到STL,但STL里的std::string 里并没有内建的trim函数用于去除字符串两边的空白,同时也没有将某个字符串分割成字符串数组的内置函数。笔者零时需要一个这样的函数,自己编写了一个,现分享如下:

一、C++实现字符串 trim

      去除字符串两边的空白,空白包括 空格(0x20)与 tab字符(\t),函数实现如下:

#include<string>void trim(std::string& str)
{size_t size = str.size();if (size == 0)return;const char * data = str.data();size_t first = 0;while (first < size) {if (data[first] == ' ' || data[first] == '\t')first++;elsebreak;}if (first == size) {str = "";return;}size_t last = size -1;while (last > first) {if (data[last] == ' ' || data[last] == '\t')last--;elsebreak;}if (first == 0 && last == size - 1)return;str = str.substr(first, last - first + 1);
}

 这个函数在必要时修改原字符串,为了避免参数传递时重复调用std::string构造函数,需要用引用传递参数,即修改原字符串。如果字符串两边没有空白,则原字符串不做任何修改,这是符合要求的。函数返回值为 void,而不是 std::string ,这样可以避免重复调用std::string构造函数。

二、C++实现字符串split

在javascript、php与python等语言中,都有一个字符串的分割函数,将字符串分割成一个字符串列表,笔者实现的代码如下:

#include<string>
#include<vector>size_t str_split(const std::string& s, std::vector<std::string>& tokens, char delimiter = ' ', bool use_trim=true)
{tokens.clear();size_t begin_pos = s.find_first_not_of(delimiter, 0);while (begin_pos != std::string::npos) {size_t end_pos = s.find(delimiter, begin_pos);std::string token = s.substr(begin_pos, end_pos - begin_pos);if (use_trim) {trim(token);}if (!token.empty())tokens.emplace_back(token);if (end_pos != std::string::npos)begin_pos = s.find_first_not_of(delimiter, end_pos + 1);elsebreak;}return tokens.size();
}

该函数通过参数 delim 来指定分割字符,如果传入一个非空的字符串,函数会返回一个字符串数组。函数有一个参数 use_trim 用来指定是否为分割得到的结果去除空白字符,这在处理用户的不规范输入时特别有用,例如用户输入一个形如"abc |  123  | hkj  "的字符串,在每一个分割符左右都有空格,而计算结果可能需要去除,str_split 正好能满足要求。

三、调用示例:

#define TEST_COUNT 1000void test_str_split()
{std::string str = "ABC|| CDE | \t123|  456 || 789|";std::vector<std::string> tokens1;str_split(str, tokens1, '|');std::cout << "strlist:" << tokens1.size() << " " << std::endl;str = "|| CDE|";str_split(str, tokens1, '|');std::cout << "strlist:" << tokens1.size() << " " << std::endl;str = "  CDE|";str_split(str, tokens1, '|');std::cout << "strlist:" << tokens1.size() << " " << std::endl;str = "ABC|| CDE | \t123|  456 || 789|vvv|ddd|ccc|eff|zzz|||";str_split(str, tokens1, '|', false);std::cout << "strlist:" << tokens1.size() << " " << std::endl;
}


http://www.mrgr.cn/news/46749.html

相关文章:

  • vue3+ts+uniapp 微信小程序(第一篇)—— 微信小程序定位授权,位置信息权限授权
  • ESP8266 AP模式 网页配网 arduino ide
  • 哥大开发AI模型助力癌症和遗传病研究,近屿智能专注培养AI人才
  • OpenCV相机标定与3D重建(51)对 3x3 矩阵进行 RQ 分解(RQ Decomposition)函数RQDecomp3x3()的使用
  • Pyinstaller打包
  • 【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)
  • 【AIGC】OpenAI API在快速开发中的实践与应用:优化ChatGPT提示词Prompt加速工程
  • 速盾:cdn加速是高防cdn好还是普通cdn好?
  • 物联网(IoT)的未来发展:智能互联时代的到来
  • SQL进阶技巧:Order by 中 NULLS LAST特性使用?
  • Kotlin真·全平台——Kotlin Compose Multiplatform Mobile(kotlin跨平台方案、KMP、KMM)
  • OpenCV库模块解析
  • KVM虚拟化技术介绍
  • ESP32-C3实现ADC
  • 代码随想录算法训练营第五六天| 99. 岛屿数量 100. 岛屿的最大面积
  • 搜维尔科技:Haption远程操作项目模拟项目
  • 动态内存分配 VS 静态内存分配
  • 【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)
  • 这个问题做项目的时给某些客户普及过,这里再给你普及一下
  • FireFox简单设置设置
  • 创建osd加入集群
  • linux基础-----基础命令+较新替代命令汇总详解
  • CF E. Money Buys Happiness
  • 【动态规划】
  • Http 协议和 RPC 协议有什么区别?
  • JavaEE: HTTPS的魅力与优势揭秘