zoukankan      html  css  js  c++  java
  • 三种不同的方式来保存分割后的字符串--strtok

    主文件:

    /*
    	功能:主要是实现字符串分割,并选择了三种不同的方式来保存结果。
    	最终证明:可能最方便的还是第一种方法(方便、快捷,不用自己做太多的工作,可以自己维护内存空间)
    */
    
    #include <iostream>
    #include <vector>
    #include "z_string.h"
    
    using namespace std;
    
    void Spliter(char* pSrc, char* spliter, vector<string>& v)
    {
    	char* token = NULL;
    	char* temp = new char[strlen(pSrc)+1];
    	strcpy(temp, pSrc);
    	token = strtok(temp, spliter);			// strtok会改变temp的值,所以上面作了拷贝字符串的工作
    	while(token)
    	{
    		v.push_back(token);
    		token = strtok(NULL, spliter);
    	}
    	delete temp;
    }
    
    void Display(vector<string>& v)
    {
    	for(vector<string>::iterator it = v.begin(); it != v.end(); it++)
    	{
    		cout<<"#"<<it->c_str()<<"#"<<endl;
    	}
    }
    
    string* Spliter(char* pSrc, char* spliter)
    {
    	string* ret = NULL;
    	char* token = NULL;
    	vector<string> v;
    	char* temp = new char[strlen(pSrc)+1];
    	strcpy(temp, pSrc);
    	token = strtok(temp, spliter);
    	while(token)
    	{
    		v.push_back(token);
    		token = strtok(NULL, spliter);
    	}
    	delete temp;
    
    	int n = v.size();
    	ret = new string[n+1];
    	char t[20] = {0};
    	itoa(n, t, 10);
    	ret[0] = t;						// 第一个元素保存数组长度
    
    	for(int i = 1; i <= n; i++)
    	{
    		ret[i] = v.at(i-1);
    	}
    
    	return ret;
    }
    
    void Display(string* pList)
    {
    	int n = atoi(pList[0].c_str());
    	for(int i = 1; i <= n; i++)
    	{
    		cout<<"#"<<pList[i].c_str()<<"#"<<endl;
    	}
    }
    
    void main()
    {
    	char src[] = "what are you, do 1.0, 2.33, 556";
    	char spliter[] = ", \t\n";
    
    	// 法一:用vector<string>保存分割后的结果
    	vector<string> v1;
    	Spliter(src, spliter, v1);
    	Display(v1);
    
    	// 法二:用string[]保存结果
    	cout<<endl;
    	string* pList = Spliter(src, spliter);
    	Display(pList);
    	delete [] pList;		// 写成“delete pList;”将出错
    
    	// 法三:自定义类来管理空间
    	cout<<endl;
    	z_string zs;
    	zs.Spliter(src, spliter);
    	zs.Display();
    }
    

    z_string.h:

    #include <string>
    
    using namespace std;
    // 经过封闭的string[]类,动态可变的元素个数及自动地管理所分配的空间
    class z_string
    {
    private:
    	int length;
    	string* list;
    
    public:
    	z_string(int n = 0);
    	~z_string();
    
    	void Spliter(char* src, char* op);
    
    	int getSize();
    	string at(int n) const;
    	void Display();
    	void Free();
    };
    

    z_string.cpp:

    /*
    	2011-2-26 20:15 JoeBlackZQQ(joeblackzqq@163.com)
    
    	功能:封装的string类,主要功能是对字符串进行分割,再保存结果,可自己维护内存
    */
    
    #include <iostream>
    #include <vector>
    #include "z_string.h"
    
    z_string::z_string(int len)
    {
    	if(len > 0)
    	{
    		list = new string[len];
    		length = len;
    	}
    	else
    	{
    		length = 0;
    		list = NULL;
    	}
    }
    
    z_string::~z_string()
    {
    	Free();
    }
    
    void z_string::Spliter(char* src, char* separator)	// 对字符串进行分割,并保存结果
    {
    	Free();
    
    	int len = strlen(src) + 1;
    	char* pTemp = new char[len];
    	strcpy(pTemp, src);
    
    	char* token = NULL;
    	vector<string> v;
    	token = strtok(pTemp, separator);
    	while(token)
    	{
    		v.push_back(token);
    		token = strtok(NULL, separator);
    	}
    	delete pTemp;
    
    	length = v.size();
    	list = new string[length];
    	for(int i = 0; i < length; i++)
    	{
    		list[i] = v.at(i);
    	}
    }
    
    int z_string::getSize()
    {
    	return length;
    }
    
    string z_string::at(int i) const
    {
    	if(i >= 0 && i < length)
    	{
    		return list[i];
    	}
    	else
    		return NULL;
    }
    
    void z_string::Display()
    {
    	for(int i = 0; i < length; i++)
    	{
    		cout<<list[i].c_str()<<endl;
    	}
    }
    
    void z_string::Free()
    {
    	if(list)
    	{
    		delete [] list;
    		list = NULL;
    		length = 0;
    	}
    }
    
  • 相关阅读:
    大数据量下的SQL Server数据库自身优化
    NodeJS 学习笔记
    SOA、ESB、NServiceBus、云计算 总结
    .NET及.NET Core系统架构
    TCP/IP协议、HTTP协议、SOCKET通讯详解
    web压测工具http_load
    前端面试问题答案汇总--通识篇
    前端面试问题答案汇总--高级篇
    前端面试问题答案汇总--进阶篇
    前端面试问题答案汇总--基础版
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/1965916.html
Copyright © 2011-2022 走看看