自定义stringbuffer类(C++)

本文介绍了一个使用C++实现的字符串缓冲区类,该类提供了格式化字符串、转换为十六进制字符串、追加字符串等功能,适用于动态构建和操作字符串的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#ifndef TG_STRBUF_H
#define TG_STRBUF_H

#include<iostream>
#include <stdarg.h>
#include<string.h>
#include<vector>

class tg_strbuf
{
public:
    tg_strbuf():tg_strbuf(0)
    {}

    tg_strbuf(uint32_t capacity):_len(0)
    {
        _capacity=capacity;
        if(_capacity<256)
        {
            _capacity=256;
        }

        _buf=new char[_capacity]{0};
    }

    void format(const char*fmt,...)
    {
        clear();
        va_list args;
        va_start(args, fmt);
        int n=vsprintf(_buf + _len,fmt, args);
        _len += n;
        va_end(args);
    }

    void append_format(const char*fmt,...)
    {
        va_list args;
        va_start(args, fmt);
        int n=vsprintf(_buf + _len,fmt, args);
        _len += n;
        va_end(args);
    }

    ///转为16进制字符串
    void to16str(const std::vector<char>& arr)
    {
        if(arr.size())
        {
            to16str( &arr[0], arr.size());
        }
        else
        {
            to16str(nullptr, 0);
        }
    }

    ///转为16进制字符串
    void to16str(const char* data, uint32_t len)
    {
        clear();
        if(len<1)
        {
            return;
        }
        _len = len*3 - 1 ;
        reserve(_len + 1);

        sprintf(_buf, "%02X", static_cast<unsigned char>(*data++));
        char* tmp = _buf+2;

        for(uint32_t i=1; i<len; i++)
        {
            sprintf(tmp, " %02X", static_cast<unsigned char>(*data++));
            tmp+=3;
        }
        *tmp=0;
    }

    tg_strbuf& append(const std::string& str)
    {
        return append(str.c_str(), str.length());
    }

    tg_strbuf& append(const char* str)
    {
        auto len = static_cast<uint32_t>(strlen(str));

        return append(str, len);
    }

    tg_strbuf& append(const char* str, uint32_t n)
    {
        auto len = n+1;
        reserve(_len+len);

        strcpy(_buf+_len, str);
        _len+=len-1;

        return *this;
    }

    void reserve(uint32_t capacity)
    {
        if(capacity > _capacity)
        {
            _capacity = 2*_len > capacity ? 2*_len:capacity;
            auto tmp = new char[_capacity];
            strcpy(tmp, _buf);
            delete [] _buf;
            _buf=tmp;
        }
    }

    const char* c_str()const
    {
        return _buf;
    }

    void clear()
    {
        _len=0;
        *_buf=0;
    }

    uint32_t len() const
    {
        return _len;
    }

    uint32_t capacity()const
    {
        return _capacity;
    }

    tg_strbuf(const tg_strbuf&)=delete;
    tg_strbuf& operator=(const tg_strbuf&)=delete;

    ~tg_strbuf()
    {
        delete [] _buf;
    }

private:
    uint32_t _len;
    uint32_t _capacity;
    char* _buf;
};

#endif // TG_STRBUF_H

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值