[ 子弹的工具箱 ] 之 String 类

[ 子弹的工具箱 ] 之 String 类
与大家分享我的工具箱中的一些小TOOLS
欢迎自由取用……   :-)
欢迎多提意见 [email protected]

--------------------------------------------------
以下为函数的声明:
 //------------------------------------------------------------------------- // 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; }

上面是关于字符串的。其他的慢慢再帖……卖个关子先
呵呵……

你可能感兴趣的:([ 子弹的工具箱 ] 之 String 类)