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

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++;
		else
			break;
	}

	if (first == size) {
		str = "";
		return;
	}

	size_t last = size -1;
	while (last > first) {
		if (data[last] == ' ' || data[last] == '\t')
			last--;
		else
			break;
	}

	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);
		else
			break;
	}

	return tokens.size();
}

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

三、调用示例:

#define TEST_COUNT 1000

void 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.kler.cn/news/340494.html

相关文章:

  • (笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第3关---浦语提示词工程实践
  • 如何使用pymysql和psycopg2执行SQL语句
  • 使用XML实现MyBatis的基础操作
  • pandas的用法
  • Github界面学习
  • C++ 函数重载
  • 手动更换SSL证书教程及注意事项
  • 【论文阅读】AUTOREGRESSIVE ACTION SEQUENCE LEARNING FOR ROBOTIC MANIPULATION
  • 接着上一篇stp 实验继续
  • Http 协议和 RPC 协议有什么区别?
  • OpenAI .NET 库稳定版发布,支持 GPT-4o 并改进 API 功能
  • 逼近理论及应用精解【9】
  • 【优选算法】(第三十篇)
  • 详解JavaScript作为命名空间的函数
  • 腾讯云SDK项目管理
  • 图像数据增强库综述:10个强大图像增强工具对比与分析
  • Facebook 正式推出了一项专为 Z 世代设计的全新改版
  • webGL进阶(一)多重纹理效果
  • windows C++-避免死锁(上)
  • [JAVA]连接数据库 并在Java中实现查询员工信息功能