c++ 常用字符串处理函数

字符串是目前处理是目前工程项目中出现最多的问题,尤其是自然语言处理,文本处理和分析等等,c++目前只提供比较简单的字符串处理函数,不像Python,Java对字符串操作功能强大,下面是自己封装的几个常用字符处理的函数,其实功能实现应该有很多种,但是由于字符串处理是基础函数,需要适当的考虑算法实现的性能。下面是自己实现的一些功能,性能感觉还不错。

/*********************************************
function: string common functions.
author: liuyi
date: 2015.08.29
vesion: 1.0
**********************************************/

#ifndef STR_FUN_H
#define STR_FUN_H

#include <iostream>
#include <string.h>
#include <string>
#include <vector>
using namespace std;

inline void split_string(const char* src, const string& sep, vector<string>& split_vec)
{
	const char *separator = sep.c_str();
	split_vec.clear();
	split_vec.reserve(16);
	if(src == NULL || separator == NULL)
		return;

	const char *p = strstr(src, separator);
	if(NULL == p)
	{
		split_vec.push_back(src);
		return;
	}

	if(p == src)
	{
		split_vec.push_back("");
	}
	else
	{
		split_vec.push_back(string(src, p - src));
	}

	size_t len = strlen(separator);
	const char* pre = p + len;
	while(p = strstr(p + len, separator))
	{
		split_vec.push_back(string(pre, p - pre));
		pre = p + len;
	}

	if('\0' == *pre)
	{
		split_vec.push_back("");
	}
	else
	{
		split_vec.push_back(string(pre));
	}
}

inline void split_string(const string& src, const string& sep, vector<string>& split_vec)
{
	string::size_type i = src.find(sep);
	if(string::npos == i)
	{
		split_vec.push_back(src);
		return;
	}

	if(0 == i)
	{
		split_vec.push_back("");
	}
	else
	{
		split_vec.push_back(src.substr(0, i));
	}

	size_t len = sep.size();
	string::size_type pre = i + len;
	while(string::npos != (i = src.find(sep, pre)))
	{
		split_vec.push_back(src.substr(pre, i - pre));
		pre = i + len;
	}

	split_vec.push_back(src.substr(pre));
}

inline string join_string(const string& sep, const vector<string>& str_vec)
{
	string str;
	str.reserve(32*str_vec.size());

	size_t len = str_vec.size();
	if(len > 0)
	{
		str = str_vec[0];
	}

	for(size_t i = 1; i < len; i++)
	{
		str.append(sep);
		str.append(str_vec[i]);
	}

	return str;
}

inline string replace_string(const string& raw_str, const string& src_str, const string& replace_str)
{
	string new_str;
	new_str.reserve(raw_str.size()*2);
	size_t begin = 0;
	size_t len = src_str.size();
	string::size_type i = raw_str.find(src_str);
	if(string::npos == i)
		return raw_str;

	do
	{
		new_str.append(raw_str.substr(begin, i - begin));
		new_str.append(replace_str);
		begin = i + len;
	}
	while(string::npos != (i = raw_str.find(src_str, begin)));

	return new_str.append(raw_str.substr(begin));
}

string lstrip(const string& src, const string& sub_str)
{
	size_t len = sub_str.size();
	string::size_type i = 0;

	i = src.find(sub_str, i);
	int count = 0;
	if(i == 0)
	{
		count = 1;
		while((i = src.find(sub_str, i+len)) != string::npos)
		{
			if(i != len*count)
				break;
			count++;
		}
	}
	else
	{
		return src;
	}

	return src.substr(len*count);
}

string rstrip(const string& str, const string& sub_str)
{
	int sub_len = sub_str.size();
	int last_index = str.size()-1;
	for(int i = last_index; i >= 0; i -= sub_len)
	{
		int flag = 0;
		for(int j = 0; j < i && j < sub_len; j++)
		{
			if(sub_str[j] != str[i + 1 - sub_len + j])
			{
				flag = 1;
				break;
			}
		}

		if(flag == 1)
		{
			break;
		}
		else
		{
			last_index = i - sub_len;
		}
	}

	return str.substr(0, last_index+1);
}

inline string strip(const string& src, const string& sub_str)
{
	return lstrip(rstrip(src, sub_str), sub_str);
}

inline int count_of_substr(const string& str, const string& sub_str)
{
	int count = 0;
	size_t len = sub_str.size();
	string::size_type i = 0;
	while((i = str.find(sub_str, i))!= string::npos)
	{
		count++;
		i += len;
	}

	return count;
}

inline int count_of_substr(const char *src, const string& sub_str)
{
	int count = 0;
	size_t len = sub_str.size();
	const char *p = sub_str.c_str();
	const char *index = src;
	while(NULL != (index = strstr(index, p)))
	{
		count++;
		index += len;
	}

	return count;
}

string lower_string(const string& src)
{
	string lower_str = src;
	size_t len = src.size();
	for(size_t i = 0; i < len; i++)
	{
		if(src[i] >= 'A' && src[i] <= 'Z')
			lower_str[i] += 32;
	}

	return lower_str;
}

string upper_string(const string& src)
{
	string upper_str = src;
	size_t len = src.size();
	for(size_t i = 0; i < len; i++)
	{
		if(src[i] >= 'a' && src[i] <= 'z')
			upper_str[i] -= 32;
	}

	return upper_str;
}

#endif
#include <iostream>
#include <stdlib.h>
#include "str_fun.h"
using namespace std;

int main(int agrc, char *argv[])
{
	char s[16] = {"12#34#56"};
	vector<string> v;
	split_string(string(s), "#", v);
	for(int i = 0; i < v.size(); i++)
		cout<<v[i]<<endl;
	cout<<join_string("#", v)<<endl;
	cout<<replace_string(s, "34", "")<<endl;
	cout<<count_of_substr("##", "#")<<endl;
	cout<<lower_string("AbC")<<endl;
	cout<<upper_string("AbC")<<endl;
	cout<<lstrip("aaaabc", "aab")<<endl;
	cout<<rstrip("abcabcabc", "abcd")<<endl;
	cout<<strip("abcabcaba", "a")<<endl;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-31 09:36:55

c++ 常用字符串处理函数的相关文章

mysql 编程注意事项及常用字符串处理函数

一)建立存储过程时报SQL错误( have an error in your SQL syntax;....) 建立PROCEDURE等类型过程前需加上delimiter // ,最后也要以// 结尾,例如 delimiter // CREATE PROCEDURE UPDATE_PROCESSDEFID() BEGIN ....... END; // 在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令. delimiter告诉客户端这段范围才算一个名利,而不是遇到

php常用字符串处理函数

PHP 字符串函数是 PHP 核心的组成部分.无需安装即可使用这些函数. 常用的字符串处理函数: str_replace():替换字符串中的一些字符(对大小写敏感). str_repeat():把字符串重复指定的次数. strlen():返回字符串的长度. stripos():返回字符串在另一字符串中第一次出现的位置(对大小写不敏感). str_split():把字符串分割到数组中. trim():移除字符串两侧的空白字符和其他字符. ltrim():移除字符串左侧的空白字符或其他字符. rtr

PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)

/*常用的字符串输出函数 * * echo() 输出字符串 * print() 输出一个或多个字符串 * die() 输出一条信息,并退出当前脚本 * printf() 输出格式化字符串 * sprintf() 把格式化的字符串写入到一个变量中 * */ //ucfirst //将字符串中的首字母转换为大写 $str="string"; echo ucfirst($str); echo "<hr><br/>"; //ucwords() //将

常用字符串Hash函数

几个常用的字符串Hash函数如下: SDBMHash函数 unsigned int SDBMHash(char *str) { unsigned int hash = 0; while (*str) { // equivalent to: hash = 65599*hash + (*str++); hash = (*str++) + (hash << 6) + (hash << 16) - hash; } return (hash & 0x7FFFFFFF); } RSHa

C语言的常用字符串操作函数(一)

一直做的是单片机相关的程序设计,所以程序设计上更偏向底层,对于字符串的操作也仅限于液晶屏幕上的显示等工作,想提高下字符串操作的水平,而不是笨拙的数组替换等方式,翻看帖子发现C语言的字符串操作函数竟然这样丰富而实用,在此记录,已备后用. No.1 strlen():字符串长度计算函数 应用实例: 1 #include<stdio.h> 2 #include<string.h> 3 4 char TextBuff[] = "Hello_My_Friend!"; 5

mysql常用字符串操作函数大全

测试表 CREATE TABLE `string_test` ( `id` int(11) NOT NULL auto_increment COMMENT '用户ID', `name` varchar(50) NOT NULL default '' COMMENT '名称', `job` varchar(23) NOT NULL COMMENT '工作', `sex` tinyint(1) NOT NULL default '1' COMMENT '性别', `hobby` varchar(10

mysql常用字符串操作函数大全,以及实例

今天在论坛中看到一个关于mysql的问题,问题如下 good_id     cat_id12654         665,56912655         601,4722 goods_id是商品idcat_id是分类id当我,怎么根据这种分类ID查数据(一个商品有多个分类,而且用逗号隔开了)我现在用的是like 这样的话,输入一个分类id是688,或者4722都能出来这个商品,但输入一个722也出来这个商品了. 如果用like做的话,肯定会有问题的,我的开始的想法是,把cat_id里面的字符

C语言常用字符串操作函数总结

函数名: strcpy 功 能: 将参数src字符串拷贝至参数dest所指的地址 用 法: char *strcpy(char *dest, const char *src); 返回值: 返回参数dest的字符串起始地址 说 明: 如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况,在编写程序时需特别留意,或者用strncpy()来取代: 程序例: #include <stdio.h> #include <string.h> int main(void) { cha

Hive常用字符串操作函数

? ? 返回类型 函数名 描述 int length(string A) 返回字符串A的长度 select length(weoirjewo);select length(name) from stu; 此函数在实际工作,可以用于校验手机号,身份号等信息的合法性 string reverse(string A) 返回字符串A的反转结果 select reverse('abcd');select length(name) from stu; string concat(string A, stri