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的指针。

posted on 2016-03-24 22:16  各种笔记  阅读(270)  评论(0编辑  收藏  举报