표준 string클래스

sz L·2023년 4월 3일
0

C++

목록 보기
34/40
post-thumbnail

표준 string 클래스

C++ 표준 라이브러리에는 string이라는 클래스가 정의되어 있다.
문자열의 처리를 목적으로 정의된 클래스임
사용시 <string> 헤더파일 사용

! 원래는 char형의 배열 또는 char형의 포인터를 사용하여 문자열을 사용했음 !

#include <iostream>
#include <cstring>
using namespace std;
#pragma warning(disable:4996)

class String
{
private:
	int len;
	char* str;
public:
	String();						// 디폴트 생성자
	String(const char* s);			// 문자열을 받는 생성자
	String(const String& s);		// 복사생성자(참조 형태로 매개변수 입력 받으면)
	~String();						
	String& operator= (const String& s);
	String& operator+= (const String& s);
	bool operator == (const String& s);
	String operator+ (const String& s);

	friend ostream& operator<<(ostream& os, const String& s);
	friend istream& operator>>(istream& is, String& s);
};

String::String()
{
	len = 0;
	str = NULL;
}

String::String(const char* s)
{
	len = strlen(s) + 1;
	str = new char[len];
	strcpy(str, s);
}

String::String(const String& s)
{
	len = s.len;
	str = new char[len];
	strcpy(str, s.str);
}

String::~String()
{
	if (str != NULL)
		delete[] str;
}

String& String::operator=(const String& s)
{
	if (str != NULL)
		delete[] str;
	len = s.len;
	str = new char[len];
	strcpy(str, s.str);
	return *this;
}

String& String::operator+= (const String& s)
{
	len += (s.len - 1);		// 문자열 두 개 크기(널문자는 하나만 필요하니 -1해준다)
	char* tempstr = new char[len];
	strcpy(tempstr, str);
	strcat(tempstr, s.str);	// strcat : 문자열 붙이기(문자열A에 원하는 문자열B를 문자열A 뒤쪽에 이어 붙이는 함수)

	if (str != NULL)
		delete[] str;
	str = tempstr;
	return *this;
}

bool String::operator==(const String& s)
{
	return strcmp(str, s.str) ? false : true;
}

String String::operator+(const String& s)
{
	char* tempstr = new char[len + s.len - 1];
	strcpy(tempstr, str);
	strcpy(tempstr, s.str);

	String temp(tempstr);
	delete[] tempstr;
	return temp;
}

ostream& operator<<(ostream& os, const String& s)
{
	os << s.str;
	return os;
}// 전역함수로써 오버로딩 됨

istream& operator>>(istream& is, String& s)
{
	char str[100];
	is >> str;
	s = String(str);
	return is;
}// 전역함수로써 오버로딩 됨

int main()
{
	String str1 = "I like ";
	String str2 = "string class";
	String str3 = str1 + str2;

	cout << str1 << endl;
	cout << str2 << endl;
	cout << str3 << endl;

	str1 += str2;
	if (str1 == str3)
		cout << "동일 문자열!" << endl;
	else
		cout << "동일하지 않은 문자열!" << endl;

	String str4;
	cout << "문자열 입력: ";
	cin >> str4;
	cout << "입력한 문자열: " << str4 << endl;

	return 0;
}

profile
가랑비는 맞는다 하지만 폭풍은 내 것이야

0개의 댓글