관리 메뉴

공부 기록장 💻

[C++] string 클래스 - string 문자열 객체 동적 생성, string 멤버 함수 사용 본문

# Language & Tools/C++

[C++] string 클래스 - string 문자열 객체 동적 생성, string 멤버 함수 사용

dream_for 2021. 4. 7. 14:56

(명품 C++ 프로그래밍 ch 4.6)

 

 

string 클래스

 

- C++ 표준 라이브러리에서 제공하는 클래스로서, 문자열을 객체로 다룬다.

- 문자열을 저장하는버퍼와 함께, 문자열을 다루는 함수, 연산자를 멤버로 가지고 있다.

- 문자열의 크기에 맞추어 스스로 메모리크기를 조절한다.

 

string 클래스를 사용하기 위해선 다음 코드가 필요하다.

 

#include <iostream>
using namesapce std;

 


string 객체 생성과 문자열 입력/출력

 

 

string 객체 생성 및 출력

 

스트링 객체를 생성하는 몇 가지 방법이 있다.

 

1. 빈 문자열

2. 문자열 리터럴로 초기화

3. 다른 스트링 객체를 복사하여 생성

4. C-스트링의 char[] 배열로부터 생성

 

생성자 설명 예시
1. string() 빈 문자열 string str;
2. string("literal") 문자열 리터럴로 초기화하여 생성 string address("서울");
3. string(const string& str) str을 복사한 새로운 객체 생성 string copyAddress(address);
4-1. string(const char *s) C-스트링의 s 문자열을 복사하여 생성 char text[]="Hello";
string title (text);
4-2. string(const char *s, int n) 문자배열 s에서n개의 문자를 복사하여 생성 string title(text, 2);

<string 클래스의 주요 생성자>

 

 

 

위의 주요 생성자를 이용하여 예제를 작성하고 출력하여 결과를 확인해보면 다음과 같다.

 

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int main() {

	string str; // 빈 문자열을 가진 스트링 객체
	string address("서울 성북구"); // 문자열 리터럴로 초기화
	string copyAddress(address); // address를 복사한 객체

 // C-스트링(char[] 배열)로부터 스트링 객체 생성

	char text[] = "Hello"; // C-스트링의 char[] 배열
	string title(text); // C-스트링을 문자열 객체로 생성
	string title2(text, 2); // n개의 문자만큼 복사

 // string 객체의 문자열 출력

	cout << str << endl;
	cout << address << endl;
	cout << copyAddress << endl;
	cout << title << endl;
	cout << title2 << endl;
}

 

 

 

 


 

string 객체의 동적 생성

 

new, delete 연산자를 이용해 스트링 객체를 동적으로 생성하고 반환할 수 있다.

 

 

다음은는 동적으로 생성한 str 객체의 기존 문자열에 또다른 문자열을 추가하여 출력하는 예시이다.

#include <iostream>
#include <string>
using namespace std;

int main() {
	string* str = new string("Love"); // 스트링 객체 str 동적 생성
	cout << *str << endl; // 문자열 객체 출력
    
	str->append(" You!"); // 기존 str 뒤에 문자열 추가
	cout << *str << endl; // 새로 만들어진 문자열 출력
    
	delete str; // 객체 반환
}

 

 

 


string 객체에 문자열 입력

 

1. cin >> 연산자 이용 (공백 문자 입력되면 이전까지만 하나의 문자열로 다룸)

2. getline() 전역 함수 이용 (문자열의 마지막을 표시하는 구분 문자를 인수로 전달)

 

getline(cin, str, delimiter); 

- 인수: cin, string 객체, 구분자

- 마지막 구분 문자는 문자열에 삽입하지않는다.

 

#include <iostream>
#include <string>

using namespace std;

int main() {
	string name[5]; // string 배열 객체 선언

	for (int i = 0;i < 5;i++) {
		cout << "이름 >> ";
		getline(cin, name[i], '\n');
	}

	string latter = name[0]; // latter은 사전적으로 가장 뒤에 있는 문자열 저장
	for (int i = 1;i < 5;i++)
		if (name[i] > latter) // name[i]가 latter 보다 뒤에 온다면
			latter = name[i]; // latter 변경

	cout << "사전에서 가장 뒤에 나오는 문자열은 " << latter << endl;

}

 

다음은 입력 받은 영어와 한글에 대한 결과 창이다.

 

 

 

 

 

 


 

 

<string 클래스의 주요 멤버 함수>

 

멤버 함수 원형 설명 예제
string& append(const string& char); 문자열 연결

문자열 뒤에 str 추가
string a("Love");
string b("too");
a.append(" You "); // a = "Love You "
a.append(b); // a = "Love You too"

string c=a.append(" You ").append(b) // c = "Love You too"
stinrig& append(const string &str, int pos, int n); str 문자열 내  pos 위치에서 문자 n개를 현재 문자열 뒤에 추가 string a("Love");
string b("You very much.");
a.append(b, 3, 10); // a = "Love very much"
string& insert(int pos, const string& str); 문자열 삽입
문자열의 pos위치에 str삽입
string a("Hello.");
a.insert(5, ", Hi"); // a = "Hello, Hi."
string& replace(int pos, int n, const string& str); 문자열의 pos 위치부터 n개 문자를 str로 대치 string a("Hello");
a.replace(1, 4, "i"); // a = "Hi"
int size();
int length();
문자열 길이

문자열의 길이 반환
(영어 문자 바이트 - 한글: 한 문자 2바이트)
string a("Hello");
string b("안녕");

int n = a.size(); // n = 5
int k = b.length(); // k = 4
int capacity(); 할당된 메모리 크기 리턴 string a("Hello");
string b("안녕");

int n = a.capacity(); // n = 15
int k = b.capacity(); // k = 15
string& erase(int pos, int n); 문자열 삭제
pos 위치부터 n개 문자 삭제
string a("Hello");
a.erase(2, 2); // a = "Heo"
void clear(); 문자열 모두 삭제. 크기를 0으로 만듬 string a("Hello");
a.clear(); // 빈 문자열로 변경
bool empty(); 문자열 크기가 0이면 true, 아니면 false 반환 string a("Hello");
cout<<a.empty()<<endl; // 0 출력
char& at(int pos); pos 위치의 문자 반환 string a("Hello");
cout<<a.at(a.length() -1)<<endl; // 마지막 문자 'o '출력
int find(const string& str); 문자열의 처음부터 str을 검색하여 발견한 처음 인덱스 반환, 없으면 -1 반환 string a("Hello");
cout<<a.find("l")<<endl; // 2 출력
int find(const string& str, int pos); 문자열 검색

문자열의 pos 위치부터 str을 검색하여 발견한 처음 인덱스 반환, 없으면 -1 반환
int index = 0;
string a("Hello lovely");

index = a.find('l', index);
while (index > 0) {
   cout << index << " ";
   index = a.find('l', index + 1); // 다음 인덱스부터 검색
}

// 2 3 6 10 출력
int rfind(const strng& str, int pos); 문자열의 pos 위치부터 str을 검색하여 발견한 마지막 인덱스 반환, 없으면 -1 반환  
int compare(const string& str); 문자열 비교

문자열과 str을 비교하여 같으면 0, 사전 순으로 앞에 오면 음수, 뒤에 오면 양수 반환
string a("Hello");
string b("Hi");

cout << a.compare(b) << endl; // 음수 반환
cout << a.compare("Hello") << endl; // 0 반환
cout << b.compare(a) << endl; // 양수 반환
strint substr(int pos);
string substr(int pos, int n);
문자열 서브스트링

pos 위치부터 n개 문자를 새로운 서브스트링으로 생성하여 반환
string a("Hello lovely");
string c = a.substr(6); // b = "lovely"
string b = a.substr(6, 4); // b = "love"
void swap(string& str); 현재 객체의 문자열과 str 문자열을 서로 바꿈 string a("Hello lovely");
string b = a.substr(6, 6); // b = "lovely"

a.swap(b); // a = "lovely", b = "hello lovely"
cout << a<<endl<<b << endl;
char* c_str(); C-스트링 문자열로 반환  

 

 

 

 

<string 클래스 연산자>

 

string s("C++"), s1("C"), s2("Java");

 

연산자 설명 예시 결과
s1=s2 문자열 치환
s2를 s1에 치환
s1=s2 s1="Java"
s [] s의 [] 인덱스에 있는 문자 반환 char c=s[1] c='+'
s1+s2 문자열 연결
s1과 s2를 연결한 새로운 문자열
s1+s2 "CJava"
s1+=s2 s1에 s2 연결 s1+=s2 s1="CJava"
s1==s2 문자열 비교
s1과 s2가 같은 문자열이면 true
s1==s2 false
s1!=s2 s1과 s2가 다른 문자열이면 treu s1!=s2 true
s1<s2 s1이 사전 순으로 s2보다 앞에 오면 true s1<s2 true
s1>s2     false
s1<=s2     true
s1>=s2     false

 

 

 

문자열의 숫자 변환

 

전역 함수 stoi() : 문자열 -> 숫자

 

 

문자 다루기>

#include <locale>

 

toupper()

isdigit()

isalpha()

 


문자열 다루는 예제들

 

 

1. 문자열 입력 받아 회전시키며 출력 하기

 

문자열 길이(length), 서브스트링 생성(substr), 문자열 연결(+연산자)

 

// 문자열 입력 받아 회전시키며 출력 시키기

#include <iostream>
#include <string>
using namespace std;

int main(void) {

	string s;
	cout << "아래에 문자열 입력하세요" << endl;
	getline(cin, s);
	int len = s.length();

	for (int i = 0;i < len;i++) {
		string first = s.substr(0, 1);
		string left = s.substr(1, len-1 );
		s = left+first;
		cout << s << endl;
	}
}

 

결과:

 

 

 

2. 덧셈 문자열을 입력 받아 덧셈 실행하여 출력

서브스트림 인자 인덱스(substr), 문자열 정수로 변환(stoi)

 

 

// 덧셈 문자열을 입력 받아 덧셈 실행

#include <iostream>
#include <string>
#include <locale>
using namespace std;

int main() {
	string s;
	cout << "7+23+10과 같이 덧셈 문자열을 입력하세요." << endl;
	getline(cin, s);
	cout << endl;

	int sum = 0;
	int startIndex = 0, index = 0;

	while (true) {
		index = s.find('+', startIndex);
		if (index == -1) // 더이상 뒤에 +가 나오지 않는 경우
		{
			// 만약 마지막에 숫자로 끝나는 경우 마지막 숫자를 sum에 더하여 저장
			if (isdigit(s[startIndex])) {
				string sub = s.substr(startIndex);
				sum += stoi(sub);
				cout << sub << endl;
			}
			break;
		}

		// sub에 startIndex부터 +를 찾은 index 사이의 문자열 저장
		string sub = s.substr(startIndex, index - startIndex);
		startIndex = index + 1;

		// 위에서 찾은 서브스트링을 정수로 바꾸어 sum에 더한다.
		sum += stoi(sub);
		cout << sub << endl;
	}

	cout << "숫자들의 합은 " << sum<<endl;
}

 

마지막 '+' 문자를 찾아 해당 인덱스 값을 반환하는 find에서

문자를 찾지 못하고 -1을 리턴하게 되는 경우에 해당하는 조건은 다음과 같이 구현 할 수 있다. (정답 코드)

 

		if (index == -1)
		{		
			string part = s.substr(startIndex);
			if (part=="")break;
			sum += stoi(part);
			cout << part<< endl;
			break;
		}

 

결과:

 

 

 

 

3. & 키가 입력될 때 까지 여러 줄의 영문 문자열을 입력 받고, 찾는 문자열과 대체할 문자열을 받아 문자열을 변경하기

 

문자열 변경(replace), 입력 버퍼 비우기(cin.ignore)

// & 키가 입력될 때까지 여러 줄의 영문 문자열을 입력 받고, 찾는 문자열과 대체할 문자열을 입력 받아 전체 문자열 변경

#include <iostream>
#include <string>
using namespace std;

int main() {
	string s;

	cout << "여러 줄의 문자열을 입력하세요. 입력의 끝은 &입니다." << endl;
	getline(cin, s, '&');
	cin.ignore(); // '&' 다음에 오는 개행 문자를 입력 버퍼로부터 제거
	
	string sFind, sReplace;
	cout << endl << "find: ";
	getline(cin, sFind);
	if (s.find(sFind, 0) == -1) {
		cout << "해당 문자열을 찾지 못함" << endl;
		return 0;
	}

	cout << "replace: ";
	getline(cin, sReplace);

	int startIndex = 0;
	while (true) {
		// startIndex부터 sFind 문자열을 찾는다.
		int index = s.find(sFind, startIndex);

		// 더이상 찾지 못하면 반복문 벗어남
		if (index == -1)break;

		// sFind를 replace로 바꾼다.
		s.replace(index, sFind.length(), sReplace);
		startIndex = index + 1;
	}

	// 바뀐 문자열 s를 출력
	cout << endl<< s << endl;
}

 

 

결과:

 

 

찾을 문자열이 포함되어 있지 않은 경우:

 

728x90
반응형
Comments