언어 자료구조 알고리즘/디딤돌 C++

[C++] 56. string 클래스 흉내내기2

언제나휴일 2016. 4. 25. 01:39
반응형


string 클래스 흉내내기

이제 자신의 string 클래스의 멤버 메서드를 하나 하나 구현해 보기로 해요.

 

제일 먼저 생성자를 구현합시다.

string::string(const char *buf)

{

먼저 입력 인자가 0(널 포인터)일 때 빈 문자열을 보관할 버퍼를 생성해서 빈 문자열을 복사하세요.

    if(buf==0)//입력 인자가 0(널 포인터)일 때

    {

        this->buf = new char[1];//크기가 1인 버퍼를 생성

        strcpy_s(this->buf,1,""); //공백 문자를 대입

    }

입력 인자가 0(널 포인터)가 아닐 때는 입력 문자열 길이를 구하여 버퍼를 생성하고 문자열을 복사하세요.

    else//입력 인자가 0(널 포인터)가 아닐 때

    {

        int len_p1 = strlen(buf)+1; //입력 문자열의 길이 + 1 을 구함

        this->buf = new char[len_p1]; //버퍼 생성

        strcpy_s(this->buf,len_p1,buf); //문자열 복사

    }

}

 

비교 연산자 중복 정의에서는 strcmp 함수를 이용하여 구현하세요.

bool string::operator==(const string &src)const

{

    return strcmp(buf,src.buf)==0;

}

bool string::operator!=(const string &src)const

{

    return strcmp(buf,src.buf)!=0;

}

bool string::operator>(const string &src)const

{

    return strcmp(buf,src.buf)>0;

}

bool string::operator>=(const string &src)const

{

    return strcmp(buf,src.buf)>=0;

}

bool string::operator<(const string &src)const

{

    strcmp(buf,src.buf)<0;

}

bool string::operator<=(const string &src)const

{

    strcmp(buf,src.buf)<=0;

}

 

개체 정보를 출력하는 view 메서드에서는 buf의 내용을 출력합니다.

void string::view(ostream &os)const

{

    os<<buf;

}

문자열 버퍼의 주소를 반환하는 메서드에서는 buf를 반환하면 되겠죠.

const char *string::c_str()const

{

    return buf;

}

 

개체 출력자를 위한 전역 <<연산자 중복 정의 메서드에서는 view 메서드를 호출합니다.

ostream &operator<<(ostream &os,const string &src)

{

    src.view(os);

    return os;

}

istream &operator>>(istream &is,string &src)

{

문자열 정보를 입력받는 전역>>연산자 중복 정의 메서드에서는 지역 변수로 문자열을 입력받을 버퍼를 선언하여 문자열을 입력받습니다.

    char buf[256];

    cin>>buf;

그리고 src 문자열의 버퍼는 메모리 해제하세요.

    delete [] src.buf;

그리고 입력받은 버퍼의 문자열 길이를 계산하여 src 개체의 버퍼를 생성하고 문자열을 복사하세요.

    int len_p1 = strlen(buf)+1; //입력 문자열의 길이 + 1 을 구함

    src.buf = new char[len_p1]; //버퍼 생성

    strcpy_s(src.buf,len_p1,buf); //문자열 복사

    return is;

}

 

이제 테스트를 해 보세요. 다음은 전체 코드입니다.


mystring 구현.zip


//mystring.h

#pragma once

#include <iostream>

using std::ostream;

using std::istream;

using std::cin;

using std::cout;

class string

{

    char *buf;

public:

    string(const char *buf=0);

    bool operator==(const string &src)const;

    bool operator!=(const string &src)const;

    bool operator>(const string &src)const;

    bool operator>=(const string &src)const;

    bool operator<(const string &src)const;

    bool operator<=(const string &src)const;

    void view(ostream &os=cout)const;

    const char *c_str()const;

    friend ostream &operator<<(ostream &os,const string &src);

    friend istream &operator>>(istream &is,string &src);

};

 

//mystring.cpp

#include "mystring.h"

#include <string.h>

 

string::string(const char *buf)

{

    if(buf==0)//입력 인자가 0(널 포인터)일 때

    {

        this->buf = new char[1];//크기가 1인 버퍼를 생성

        strcpy_s(this->buf,1,""); //공백 문자를 대입

    }

    else//입력 인자가 0(널 포인터)가 아닐 때

    {

        int len_p1 = strlen(buf)+1; //입력 문자열의 길이 + 1 을 구함

        this->buf = new char[len_p1]; //버퍼 생성

        strcpy_s(this->buf,len_p1,buf); //문자열 복사

    }

}

bool string::operator==(const string &src)const

{

    return strcmp(buf,src.buf)==0;

}

bool string::operator!=(const string &src)const

{

    return strcmp(buf,src.buf)!=0;

}

bool string::operator>(const string &src)const

{

    return strcmp(buf,src.buf)>0;

}

bool string::operator>=(const string &src)const

{

    return strcmp(buf,src.buf)>=0;

}

bool string::operator<(const string &src)const

{

    return strcmp(buf,src.buf)<0;

}

bool string::operator<=(const string &src)const

{

    return strcmp(buf,src.buf)<=0;

}

 

void string::view(ostream &os)const

{

    os<<buf;

}

const char *string::c_str()const

{

    return buf;

}

ostream &operator<<(ostream &os,const string &src)

{

    src.view(os);

    return os;

}

istream &operator>>(istream &is,string &src)

{

    char buf[256];

    cin>>buf;

    delete [] src.buf;

   

    int len_p1 = strlen(buf)+1; //입력 문자열의 길이 + 1 을 구함

    src.buf = new char[len_p1]; //버퍼 생성

    strcpy_s(src.buf,len_p1,buf); //문자열 복사

    return is;

}

 

//string 클래스 흉내내기

#include "mystring.h"

#include <iostream>

using std::cout;

using std::endl;

using std::cin;

int main()

{

    string s;

    string s2="hello";

    if(s == s2)

    {

        cout<<"서로 같다."<<endl;

    }

    else

    {

        cout<<"서로 다르다."<<endl;

    }

    s = s2;

    cout<<s<<endl;

    if(s == s2)

    {

        cout<<"서로 같다."<<endl;

    }

    else

    {

        cout<<"서로 다르다."<<endl;

    }

 

    const char *buf = s.c_str();

    cout<<"버퍼:"<<buf<<endl;

 

    cout<<"문자열:";

    cin>>s;

    cout<<"입력한 내용은 "<<s<<endl;

    return 0;

}

 

실행 화면

서로 다르다.

hello

서로 같다.

버퍼:hello

문자열:yahoo

입력한 내용은 yahoo

 

이 외에도 STL string 래스는 다양한 멤버를 제공하고 있습니다. 보다 비슷하게 만들다 보면 STL string 클래스를 이해할 수 있을 거예요.


[C++] 55. string 클래스 흉내내기1


 

반응형