我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
C、C++程序很烦人的一个地方就是字符串和字符数组的混乱(参看漫谈:C、C++字符串的困局_初级代码游戏的博客-CSDN博客),特别是网络程序,网络传输文本的时候一般是不带结束符的,使用的时候又要转成字符串,所以写了一个类自动加上结束符。
功能大概可以理解为string化的char[],除了内部进行内存管理外就是保证修改的时候最后肯定有一个字符串结束符(即使数据并非字符串)。
当然,因为提供了返回char *的方法,所以最终还是要靠自觉的。如果打算严格一些,就把这个去掉,但是,无论如何,在外面仍然可以使用强制类型转换来去掉const,这是无法从语言层面解决的。
//内部隐含保持一个结束符,不计算在容量和大小之内,确保数据可以被当作字符串使用
class CBuffer
{
private:
char * p;
size_t buffer_size;
size_t data_size;
void _init()
{
p = new char[1];
if (!p)throw "内存不足";
p[0] = '\0';
buffer_size = 0;
}
public:
CBuffer() :p(NULL), buffer_size(0), data_size(0)
{
_init();
}
CBuffer(CBuffer const & tmp) :p(NULL), buffer_size(0), data_size(0)
{
_init();
SetData(tmp.data(), tmp.data_size);
}
CBuffer & operator=(CBuffer const & tmp)
{
_init();
SetData(tmp.data(), tmp.data_size);
return *this;
}
~CBuffer()
{
if (p)delete[]p;
data_size = 0;
buffer_size = 0;
p = NULL;
}
size_t capacity()const { return buffer_size; }
size_t size()const { return data_size; }
char const * data()const { return p; }
char * getbuffer() { return p; }
void setSize(long s)
{
reserve(s);
p[s] = '\0';
data_size = s;
}
bool reserve(size_t n)
{
if (n > buffer_size)
{
char * p2 = new char[n + 1];
if (p2)
{
if (p)
{
memmove(p2, p, data_size);
delete[]p;
}
buffer_size = n;
p2[data_size] = '\0';
p = p2;
return true;
}
else
{
return false;
}
}
return true;
}
bool AddData(void const * data, long len)
{
if (!reserve(data_size + len))return false;
memmove(p + data_size, data, len);
setSize(data_size + len);
return true;
}
bool SetData(char const * sz)
{
setSize(0);
return AddData((void *)sz, strlen(sz));
}
bool SetData(char const * sz, long len)
{
setSize(0);
return AddData((void *)sz, len);
}
bool Compare(CBuffer const & tmp)const
{
if (data_size != tmp.data_size)return false;
if (data_size > 0)return 0 == memcmp(tmp.data(), data(), data_size);
else return true;
}
};
(这里是结束)