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;
}