티스토리 뷰

LANGUAGE/C++

[C++] STRING 직접 구현

진심스테이크 2018. 3. 15. 22:05

 

string을 사용하지 않고 string 역할을 하는 객체를 생성하여 사용

#include "stdafx.h"
#pragma warning(disable:4996)
#include <cstring>
#include<iostream>
using namespace std;
 
class MyString {
    char *str; //문자 메모리 공간 할당
    int len; //문자열 길이 저장 변수
public :
    MyString() {
        len = 0;
        str = NULL;
    }
 
    //소멸자
    ~MyString() { delete[] str; }
 
    //1번
    MyString(const char *p) {
        //문자열 길이 구하기
        len = strlen(p) + 1; //길이를 알려주는 함수 -> null이 빠지기 때문에 +1을 해줌
        
        //메모리 할당
        str = new char[len];
 
        //문자열 복사
        strcpy(str, p); //복사 함수 strcpy(복사할곳, 복사할것)
    }
 
    //2번
    MyString(int x, char p) {
        this->len = x + 1;
        this->str = new char[this->len]; //동적 할당
        for (int i = 0; i < x; i++) {
            str[i] = p;
        }
        str[x] = '\0'; //안넣어주면 쓰레기값
    }
 
    //3번 - 복사 생성자
    MyString(const MyString &cms) {
        len = strlen(cms.str) + 1;
        str = new char[len];
        strcpy(str, cms.str);
    }
 
    //4번
    MyString& operator+=(const char *p) {
        //원래 할당 된 배열의 길이는 21개이기 때문에 뒤에 더 붙히려면 할당을 더해줘야한다
        //동적 배열을 하나 더 한 후, 원래 할당되있는 21개짜리 배열을 새로 할당된 배열에다가 복사해서 넣어준다
        
        char *str2; //그냥 새로 옮겨 담을놈
        int len2;
        len2 = strlen(p) ;
        str2 = new char[len + len2];
        
        strcpy(str2, str);
        strcat(str2, p);
        delete[] str;
        str= new char[len + len2];
 
        strcpy(str, str2);
        delete[] str2;
        return *this;
    }
 
    //5번
    MyString& operator=(const char *p) {
        delete[] str;
        len = strlen(p) + 1;
        str = new char[len];
        strcpy(str, p);
        return *this;
    }
 
    //6번
    char& operator[](int i) { //i를 직접 받아서 넣기
        return this->str[i];
    }
 
    //7번
    MyString operator+(const MyString &pms) {
        MyString tmp; //four에 저장해주는 메모리
        int len2 = this->len + strlen(pms.str);
        tmp = new char[len2];
 
        strcpy(tmp.str, this->str);
        strcat(tmp.str, pms.str);
        return tmp;
    }
    //tmp를 받아서 대입해주는 연산자
    MyString& operator=(const MyString &cms) {
        delete[] str;
        len = strlen(cms.str) + 1;
        str = new char[len];
        strcpy(str, cms.str);
        return *this;
    }
 
    //8번
    MyString(char *c, int i) {
        char *tmp = new char[i + 1];
        for (int j = 0; j < i; j++) {
            tmp[j] = c[j];
        }
        tmp[i] = '\0';
        str = tmp; //얕은 복사
    }
 
    //9번
    MyString(char *x, char *y) {
        int len2 = y - x + 1; //주소값
        str = new char[len2];
        for (int i = 0; i < len2; i++) {
            str[i] = x[i];
        }
        str[len2 - 1] = '\0';
    }
 
    friend ostream& operator<<(ostream &cout, const MyString &ms);
    friend istream& operator>>(istream &cin, MyString &ms);
};
 
ostream& operator<<(ostream &cout, const MyString &ms) {
    cout << ms.str;
    return cout;
}
 
istream& operator>>(istream &cin, MyString &ms) {
    char *tmp = new char[10000];//받아오는놈
    cin >> tmp;
    ms.len = strlen(tmp) + 1;
    ms.str = new char[ms.len]; //최종적으로 넣어야하는놈
 
    //값을 복사
    strcpy(ms.str, tmp);
    return cin;
}
 
void main(){
    //1번
    MyString one("lottery winner!"); //생성자함수호출
    cout << one << endl; //출력연산자함수호출
    //2번
    MyString two(20, '$'); //생성자함수호출
    cout << two << endl; //출력연산자함수호출
    //3번
    MyString three(one); //복사생성자호출
    cout << three << endl; //출력연산자함수호출
    //4번
    one += "oops"; //+=연산자함수호출 ( strcat함수 )
    cout << one << endl;//문자열결합 
    //5번
    two = "sorry!that was"; //대입연산자함수 호출 
    cout << two << endl;
    //6번
    three[0] = 'p'; //[]첨자연산자함수 호출 -> operation[](0)
    cout << three << endl;
    //7번
    MyString four;
    four = two + three; //four.operator=(two.operator+(three))
    cout << four << endl;
    //8번
    char alls[] = "all's well that ends well";
    MyString five(alls, 20); //생성자호출
    cout << five << "!\n";
    //9번
    MyString six(alls + 6, alls + 10);  //생성자
    cout << six << ",";
    //10번
    MyString seven(&five[6], &five[10]);  //생성자
    cout << seven << "...\n";
    //11번
    MyString eight;
    cout << "문자열 입력하세요 :";
    cin >> eight;  // >>연산자호출
    cout << "입력한 문자열은 \"" << eight << "\" 입니다 " << endl;
}

'LANGUAGE > C++' 카테고리의 다른 글

[C++] FILE INPUT/OUTPUT  (0) 2018.03.16
[C++] TEMPLATE - 템플릿  (0) 2018.03.16
[C++] OPERATOR FUNCTION - 연산자 함수  (0) 2018.03.14
[C++] FRIEND  (0) 2018.03.14
[C++] STACK / QUEUE  (0) 2018.03.14
댓글