티스토리 뷰

Programming/C++

[c++]string class 구조짜기

쩨리쩨리 2018. 3. 16. 00:56
반응형

* string class를 못 쓰는 상황일때, 직접 string 구조를 작성하시오.(아래 코드는 실행은 되지만 최적화 부분이 미완성인 코드 입니다.)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#define _CRT_SECURE_NO_WARNINGS//에러 원인 무시해라
//#pragma warning(disable:4996)//에러 원인 무시해라
#include<iostream>
//#include<string>
#include<cstring>
 
using namespace std;
 
 
class Mystring{
 
    char *str;//문자  메모리 공간 할당하는 포인터
    int len;//문자열 길이 저장 변수
 
public:
    Mystring() {//기본 생성자
        len = 0;
        str = NULL;
    }
    //소멸자
    ~Mystring() { delete[] str; }
    //1번
    Mystring(const char *p) {
        //문자열은 주소값으로 표현된다.//주소값이 넘어옴//call by adress
        //문자열 길이 구하기
        len = strlen(p)+1;//문자열은 뒤에 항상 null 이 붙는다.
        //메모리 할당
        str = new char[len];
        //문자열 복사
        strcpy(str,p);//문자열복사 함수//주소를 넣으면 한꺼번에 복사가능
    }
    
    //2번
    Mystring(int num,const char p) {
        str = new char[num+1];
        for (int i = 0; i < num; i++)//20개를 꽉 채운다.
        {str[i] = p;}//모든 메모리에 문자를 넣는다.
        str[num] = '\0'//NULL과 '\0'은 같은 의미이다.//마지막 문자열에 null을 넣어라
        //메인에서 문자를 보낼때 ' ' 컨테이션 하나로 보냄
    }
 
    //3번
    Mystring(const Mystring &my) {
        len = strlen(my.str);//one의 길이는 이미 만들어 놓은 str의 길이
        str = new char[len+1];//새로운 str은 길이+null 길이
        strcpy(str,my.str);//새로운 str이 one의 내용 카피
    }
 
    //4번
    Mystring &operator+=(const char *p) {
        /*len += strlen(p);
        char *str2 = new char[len];
        strcpy(str2,str);
        delete[] str;
        str = new char[len];
        strcat(str,str2);
        str = str2;
        return *this;*/
                                         
        char *str2;//oops의 공간을 받아올 곳
        int len2;//oops의 길이
        len2= strlen(p);//oops의 길이
        str2 = new char[len+len2];//one의 길이+oops의 길이
 
        strcpy(str2,str);//str2에 str 복사
        strcat(str2,p);//str2에 oops 합치기
        delete []str;//str 버리기
 
        str = new char[len+len2];//다시 str에 동적 할당, 원래 길이+oops 길이
        strcpy(str, str2);//str에 str2 복사
        delete []str2;//str2 삭제
 
        return *this;//내 위치를 가리켜서 다시 반환
 
    }
    //5번
    Mystring &operator=(const char *p) {//받은 문자열 주소를 *p로 받은
        strcpy(str,p);//two의 메모리에 받은 문자열 p를 대입하라
        
        return *this;
    }
    //6번
    char &operator[](int i) {
        return this->str[i];//three에 배열의 첫번째위치를 반환해라
        //매개변수와 필드명이 같을때 매개변수를 우선시 해서 같은 명으로 인식하기 때문에 구분하기 위해서 this->를 써준다
    }
    //7번
    Mystring& operator+(const Mystring &my) {
        //two의 메모리는 Mystring &operator가 가져오고, three의 메모리는 my가 가져온다.
        
        len = strlen(str) + strlen(my.str)+1;//len의 길이=two의 길이+three의 길이
        char *tmp = new char[len];//임의의 tmp공간에 len만큼의 길이를 할당하라
        strcpy(tmp,this->str);//tmp에 str을 대입하라
        delete []this->str;//str 삭제
        str = new char[len];//새로운 str 만들어서 len만큼 공간 할당
        strcpy(str,tmp);//str에 two의 값을 넣은 tmp를 대입하라
        delete [] tmp; //tmp 삭제
        strcat(str,my.str);//str의 문자열과 three의 문자열을 더해라
        //str[len - 1] = '\0';
 
        return *this;
    }
    //7번
    Mystring& operator=(const Mystring &cc) {//객체는 객체 매개변수로 받음
        len = strlen(cc.str)+1;//len = 내가 받은 객체 길이(two+three 메모리 길이)
        str = new char[len];//str에 len만큼 메모리 할당
        strcpy(str,cc.str);//str에 two+three 문자열을 대입하라
        //str[len - 1] = '\0';
        return *this;
    }
    //8번
    Mystring(const char *p,int a) {//주소를 받는 포인터 매개변수, 숫자를 받는 매개변수
    
        str = new char[a+1];//str의 공간에 20개+null 갯수만큼 메모리를 넣어라
        for (int i = 0; i < a; i++)//검색하는 for문
        {str[i] = p[i];}//str의 공간마다 문자열을 각각 넣어라
        str[a] = NULL;//마지막 공간은 null 로 처리한다. null 앞은 모두 출력하라(cout 함수로 이동)
    }
    //9번
    Mystring(const char *p, const char *a) {//주소를 받는 포인터 매개변수, 주소를 받는 포인터 매개변수
        len = (int)(a - p) + 1;//길이 = 10번째 시작주소-6번째 시작주소+null갯수
        str = new char[len];//str에 len만큼 공간 할당
        for (int i = 0; i < len; i++)//검색for문
        {str[i] = p[i];}//str의 공간마다 문자열을 각각 넣어라
        str[len-1= NULL;//마지막 공간에는 빈칸이 들어가는데
        //빈칸은 쓰레기값이라 쓰레기값이 출력된다. 쓰레기값이 있는 마지막 공간에 null을 넣어라
    }
 
    friend istream& operator>>(istream &in, Mystring &obj);//외부함수는 프렌드로 접근해야함
    friend ostream& operator<<(ostream &out, const Mystring &obj);//외부함수는 프렌드로 접근해야함
};
//10번
istream& operator>>(istream &in, Mystring &obj) {//cin 함수
    //cin의 시스템에서는 무조건 매개변수를 cin타입으로 하나 받아야함.
    char *d;
    d = new char[1000];//임의의 메모리 공간 d를 설정하고 메모리는 크게 1000으로 잡는다.
     obj.len = strlen(d)+1;//받은 문자열의 길이=1000자+null갯수
     obj.str = new char[obj.len];//받은 문자열의 메모리공간 = 받은문자열의 길이
     in >> d;//in은 d의 공간에 입력받는다
     strcpy(obj.str, d);//내가 입력한 문자열에 미리 할당한 메모리를 넣는다.
     delete [] d;
 
    return in;//cin으로 리턴한다.
}
 
ostream& operator<<(ostream &out,const Mystring &obj) {//cout 함수
    out << obj.str;//out은 obj라는 매개변수 값을 str 주소에 넣는다
 
    return out;//cout으로 리턴한다.
}
void main()
{
    //1번
    Mystring one("lottery winner!");//생성자함수호출//데이터 바뀌면 안됨(내부적으로 const 지정)
    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';//[]첨자연산자함수 호출 //three.operatorp[](0);
    cout << three << endl;
 
 
    //7번
    Mystring four;
    four = two + three;//four.operator=(two.operator+(three));//two,three
    //str = 포인터가 잡고있는거(=주소)
    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 << ",";
 
    Mystring seven(&five[6], &five[10]);  //생성자
    cout << seven << "...\n";
 
 
    //10번
    Mystring eight;//생성자
    cout << "문자열 입력하세요 :";
    cin >> eight;  // >>연산자호출
    cout << " 입력한 문자열은 \"" << eight << "\" 입니다 " << endl;
 
}
 
 
 
cs

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
댓글
공지사항