随笔 - 493  文章 - 0  评论 - 97  阅读 - 239万

三种不同的方式来保存分割后的字符串--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;
    }
}
posted on   清清飞扬  阅读(2636)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
< 2011年2月 >
30 31 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 1 2 3 4 5
6 7 8 9 10 11 12

点击右上角即可分享
微信分享提示