子弹 の VISIONS

NEVER back down ~~

C++博客 首页 新随笔 联系 聚合 管理
  112 Posts :: 34 Stories :: 99 Comments :: 0 Trackbacks
与大家分享我的工具箱中的一些小TOOLS
欢迎自由取用……   :-)
欢迎多提意见
waker615@gmail.com

--------------------------------------------------
以下为函数的声明:
	//-------------------------------------------------------------------------
	// STRING
	std::string& cut (std::string& s, const char ce =' '); // ce = "character of end"
	std::string& trim(std::string& s); // trim all space both left and right
	std::string& trimleft (std::string& s);
	std::string& trimright(std::string& s);
	std::string& toupper (std::string& s);
	std::string& tolower(std::string& s);
	std::string& format (std::string& s, const char* fmt, ...);

	// replace all the old substring with the new one in the source string
	std::string& replace(std::string& s, const std::string& oldS, const std::string& newS);

	// split string to substrings by separator-string
	std::vector<std::string>& split(const std::string& s, std::vector<std::string>& vs, const std::string& sep =";");
	
	// join substrings to a big string separated by separator-string
	std::string& join(const std::vector<std::string>& vs, std::string& s, const std::string& sep =";");

	// get all substrings by two tags WITH tags from a source string
	// e.g.
	// s = <a href="someurl">Click Here</a>
	// getDataByTags(s, vs, "<", ">"); then 
	// vs would hold two elemts:
	// vs[0] = "<a href=\"someurl\">";
	// vs[1] = "</a>";
	bool getDataByTags(const std::string& s, std::vector<std::string >& tags,
		const std::string& begTag, const std::string& endTag );
	
	// get all substrings by two tags but WITHOUT tags from a source string
	// e.g.
	// s = <a href="someurl">Click Here</a>
	// getDataByTags(s, vs, "<", ">"); then 
	// vs would hold two elemts:
	// vs[0] = "a href=\"someurl\"";
	// vs[1] = "/a";
	bool getDataBetweenTags(const std::string& s, std::vector<std::string >& data,
				 const std::string& begTag, const std::string& endTag );
以下为函数的定义:
	//-------------------------------------------------------------------------
	// STRING
	
	std::string& cut (std::string& s, const char ce)
	{
		std::string::iterator end = std::find(s.begin(), s.end(), ce);
		return (s.assign(s.begin(), end));
	}

	std::string& trim(std::string& s)
	{
		std::string::iterator beg = s.begin();
		while (beg != s.end() && ::isspace(*beg))
			++beg;
		
		std::string::reverse_iterator end = s.rbegin();
		while (end != s.rend() && ::isspace(*end))
			++end;
		
		return s.assign(beg, end.base());
	}
	
	std::string& trimleft(std::string& s)
	{
		std::string::iterator it = s.begin();
		while (it != s.end() && ::isspace(*it))
			++it;
		return s.assign(it, s.end());
	}
	
	std::string& trimright(std::string& s)
	{
		std::string::reverse_iterator it = s.rbegin();
		while (it != s.rend() && ::isspace(*it))
			++it;
		return s.assign(s.begin(), it.base());
	}
	
	std::string& toupper(std::string& s)
	{
		typedef std::string::iterator SIT;
		for (SIT it = s.begin(); it != s.end(); ++it)
		{
			*it = ::toupper(*it);
		}
		return s;
	}
	
	std::string& tolower(std::string& s)
	{
		typedef std::string::iterator SIT;
		for (SIT it = s.begin(); it != s.end(); ++it)
		{
			*it = ::tolower(*it);
		}
		return s;
	}

	std::string& format(std::string& s, const char* fmt, ...)
	{
		const int MAX_LINE_LEN = 1024; // user defined
		char buf[MAX_LINE_LEN] = {0};
		va_list ap;
		va_start(ap, fmt);
		_vsnprintf(buf, MAX_LINE_LEN, fmt, ap);
		va_end(ap);
		return (s.assign(buf));
	}

	std::string& replace(std::string& s, const std::string& oldS, const std::string& newS)
	{
		if (std::string::npos == s.find(oldS)) return (s);
		
		typedef std::string::size_type SST;
		SST beg =0, tmp =0;
		SST oldLen = oldS.size();
		SST newLen = newS.size();
		while (std::string::npos != (beg = (s.find(oldS, tmp))))
		{
			s.replace(beg, oldLen, newS);
			tmp = beg + newLen;
			std::cout << beg << "-" << tmp << ": " << s.c_str() << std::endl;
		}
		return (s);
	}

	std::string& join(const std::vector<std::string>& vs, std::string& s, const std::string& sep)
	{
		if (vs.empty()) return (s);

		typedef std::vector<std::string>::const_iterator VSCIT;
		
		for (VSCIT it = vs.begin(); it != vs.end(); ++ it)
		{
			s += *it;
			s += sep;
		}
		return (s);
	}

	//	bool split(const std::string& s, std::vector<std::string >& vs, const std::string& sep)

	std::vector<std::string>& split(const std::string& s, std::vector<std::string>& vs, const std::string& sep)
	{
		if (s.empty()) 
			return (vs);

		if (sep.empty() || std::string::npos == s.find(sep))
		{
			vs.push_back(s);
			return (vs);
		}

		typedef std::string::size_type SST;
		SST seplen = sep.size();
		SST beg =0, end =std::string::npos;

		while ( std::string::npos != (end=s.find(sep, beg)) )
		{
			vs.push_back(s.substr(beg, end-beg));
			beg = end+seplen;
		}
		vs.push_back(s.substr(beg, s.size()-beg));

		return (vs);
	}
	
	bool getDataByTags(const std::string& s, std::vector<std::string >& tags,
				 const std::string& begTag, const std::string& endTag )
	{
		if (s.empty() || begTag.empty() || endTag.empty())
			return false;

		if (std::string::npos == s.find(begTag) ||
			std::string::npos == s.find(endTag) )
		{
			return false;
		}
		
		typedef std::string::size_type SST;
		SST beglen = begTag.size();
		SST endlen = endTag.size();
		SST beg =0, end =0;
		tags.clear();
		
		while ( std::string::npos != (beg=s.find(begTag, end)) )
		{
			if( std::string::npos != (end=s.find(endTag, beg+beglen)) )
			{
				end += endlen;
				tags.push_back(s.substr(beg, end-beg));
			}
			else
				break;
		}

		return true;
	}
	
	bool getDataBetweenTags(const std::string& s, std::vector<std::string >& data,
				 const std::string& begTag, const std::string& endTag )
	{
		if (s.empty() || begTag.empty() || endTag.empty())
			return false;
		
		if (std::string::npos == s.find(begTag) ||
			std::string::npos == s.find(endTag) )
		{
			return false;
		}
		
		typedef std::string::size_type SST;
		SST beglen = begTag.size();
		SST endlen = endTag.size();
		SST beg =0, end =0;
		data.clear();
		
		while ( std::string::npos != (beg=s.find(begTag, end)) )
		{
			if( std::string::npos != (end=s.find(endTag, beg+beglen)) )
			{
				data.push_back(s.substr(beg+beglen, end-beg-beglen));
				end += endlen;
			}
			else
				break;
		}
		
		return true;
	}

其实,toupper和tolower可以这样写:
std::string& toupper(std::string& s)
{
	typedef std::string::iterator SIT;
	for (SIT it = s.begin(); it != s.end(); ++it)
	{
		if (*it >= 'a' && *it <= 'z')
		{
			*it += 'A' - 'a';
		}
	}
	return s;
}
	
std::string& tolower(std::string& s)
{
	typedef std::string::iterator SIT;
	for (SIT it = s.begin(); it != s.end(); ++it)
	{
		if (*it >= 'A' && *it <= 'Z')
		{
			*it += 'a' - 'A';
		}
	}
	return s;
}

上面是关于字符串的。其他的慢慢再帖……卖个关子先
呵呵……
posted on 2006-09-14 15:53 子弹のVISIONS 阅读(1260) 评论(6)  编辑 收藏 引用

Feedback

# re: [ 子弹的工具箱 ] 之 String 类 2006-09-14 16:15 shaker
注释下吧 这么简单的代码 还要别人去看代码理解这个函数 实在是有点说不过去  回复  更多评论
  

# re: [ 子弹的工具箱 ] 之 String 类 2006-09-14 16:40 子弹
@shaker

你说得对……
嗯。为了免得大家浪费时间,在声明的地方加了注释。

:)

欢迎讨论  回复  更多评论
  

# re: [ 子弹的工具箱 ] 之 String 类 2006-09-15 08:50 漂舟
写得不错 ! 支持作者无私的精神 !
代码中频繁使用 std::string ,
当然,你使用的typedef也解决了一部分。
我觉得可否在实现的局部文件使用
using namespace std::string,
避免代码看起来肥大。

在下愚见。  回复  更多评论
  

# re: [ 子弹的工具箱 ] 之 String 类 2006-09-17 16:39 Francis Arcanum
这个有很多现成的,不需要自己写  回复  更多评论
  

# re: [ 子弹的工具箱 ] 之 String 类 2006-11-08 10:33 cat
你的trim等对如果对中文或者日文双字节字符可能会出问题哦。  回复  更多评论
  

# re: [ 子弹的工具箱 ] 之 String 类 2006-11-15 10:45 子弹
@cat

双字节字符串用wstring和locale配合进行处理  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理