Mem, MyString
MemB.h的代码:
#pragma once #ifndef MEMB #define MEMB typedef unsigned char byte; class MemB { private: byte * mem; int size; void ensureMinSize(int minSize); public: MemB(); MemB(int sz); int msize(); byte * pointer(); byte * pointer(int minSize); ~MemB(void); }; #endif
MemB.cpp的代码:
#include "stdafx.h" #include "MemB.h" #include <cstring> using namespace std; MemB::MemB(int sz){ mem=0; size=0; ensureMinSize(sz); } MemB::MemB() { mem=0; size=0; } int MemB::msize(){ return size; } void MemB::ensureMinSize(int minSize){ if(size<minSize){ byte * newmem= new byte[minSize]; memset(newmem+size,0,minSize-size); memcpy(newmem,mem,size); delete []mem; mem=newmem; size=minSize; } } byte *MemB::pointer(){ return mem; } byte *MemB::pointer(int minSize){ ensureMinSize(minSize); return mem; } MemB::~MemB(void) { delete []mem; }
MyString的代码和main函数:
#include "stdafx.h" #include <iostream> #include <cstring> #include "MemB.h" using namespace std; class MyString{ MemB *buf; public: MyString(); MyString(char * str); ~MyString(); void concat(char * str); void print(ostream &os); }; MyString::MyString(){ buf = 0; } MyString::MyString(char * str){ buf = new MemB(strlen(str)+1); strcpy((char *)buf->pointer(),str); } void MyString::concat(char * str){ if(!buf)buf=new MemB; strcat((char*)buf->pointer(buf->msize()+strlen(str)+1),str); } void MyString::print(ostream & os){ if(!buf)return; os<<buf->pointer()<<endl; } MyString::~MyString(){ delete buf; } int _tmain(int argc, _TCHAR* argv[]) { MyString s("hello,Kate."); s.print(cout); s.concat("You will be good at it"); s.print(cout); MyString s2; s2.concat("the second test"); s2.print(cout); return 0; }
strcpy遇到的不安全问题可以通过这个来解决:
http://jingyan.baidu.com/article/ce436649fd61543773afd32e.html
1. char *strcpy(char* dest, const char *src);
把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
2.extern char *strcat(char *dest,char *src);
把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。