💻 개인공부 💻/C | C++

[C++] string 클래스 (feat. copy, getline, substr, find, replace)

공대생 배기웅 2020. 6. 24. 01:43
반응형

출처 => C++ How to Program (Detitel / Prenticehall) / 현재 그리고 미래지향적인 C++ 프로그래밍(장석우, 임정목 / 비앤씨에듀케이션)

string 클래스

C++에서 변수를 선언할 때 'c'는 char형으로, "string"은 string형을 자료형을 선언하여 준다. 여기서 "string"과 같은 자료형이 string인 변수들은 string클래스의 객체이다. 

▶ 그렇다면 string클래스란 과연 무엇인가?

#include<string>
using namespace std;

▶ string 클래스는 <string> 헤더 파일에 선언을 하여 사용한다. 

▶ 다양한 문자열 연산을 실행하는 연산자와 멤버 함수를 포함한다.

▶ 문자열, 스트링, 문자열 객체, string 객체 등으로 혼용이 된다.

▶ 문자열을 생성, 입력, 출력이 가능하다.

▶ 문자열을 숫자로 변환할 수 있다. (visual studio 2008과 2011은 지원 X)

 

 

string 클래스를 이용한 예제

1. 문자열 생성 및 출력

#include<iostream>
#include<string>//string 클래스 사용
using namespace std;

void main() {
	//스트링 생성
	string str;//빈 문자열을 가진 스트링 객체 생성
	string address("서울시 성북구 삼선동 389");
	string copyAddress(address);
		//address의 문자열을 복사한 스트링 객체 생성

	char text[] = { 'L','o','v','e',' ','C','+','+','\0' };
	string title(text);
	//Love C++ 문자열을 가진 스트링 객체 생성

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

 

2. string 배열 선언과 문자열 키를 입력하는 예제

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

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

	string latter = names[0];
	for (int i = 1; i < 5; i++) {
		if (latter < names[i])
			latter = names[i];
	}

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

▶ getline 메소드=> <string>에 정의된 cin의 멤버함수이다. getline()을 이용하여 띄어쓰기 부분까지 문자열로 저장할 수 있다. 

▶ getline( ) 함수를 호출하기 위해선 두 가지 매개변수가 필요하다. 첫 번째 매개변수는 문자열을 저장할 배열명, 두 번째 매개변수는 저장할 문자 최대 개수의 값이다. 

▶ 위에서 쓰인 getline(cin, names[i])은 cin 명령어로 받은 문자열을 names[i] 배열에 담는다는 의미이다. 

 

3. 문자열 입력 및 회전시키는 예제

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

void main() {
	string s;

	cout << "문자열을 입력하세요(한글 말고)" << endl;
	getline(cin, s, '\n');//문자열 입력
	int len = s.length();//문자열의 길이

	for (int i = 0; i < len; i++) {
		string first = s.substr(0, 1);
		//맨 앞의 문자 1개를 문자열로 분리
		string sub = s.substr(1, len - 1);
		//나머지 문자들을 문자열로 분리
		s = sub + first;
		//두 문자열을 연결하여 새로운 문자열로 만듦
		cout << s << endl;
	}
}

▶ 여기서는 substr함수가 사용이 되었다. substr( ) 함수의 목적은 문자열 추출이다. 기본적인 형식은 다음과 같다.

string substr(int pos, int len);

▶ pos는 추출을 시작한 문자열의 위치이고 len은 그 위치에서 몇 개까지의 문자를 추출할 건지를 크기를 말해준다.

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

▶ 따라서 위의 예제에서는 0번째 문자부터 1번째 문자인 'I'를 first라는 string의 객체에 저장하고, 공백부터 마지막 문자인 'g'까지를 또 다른 string의 객체인 sub에 저장한다. 

▶ 그리고 이를 sub+first 순서로 s에 저장한다. 이를 문자열의 크기인 len번 만큼 실행을 시키면 원 상태로 회전이 된다. 

 

4. 덧셈 문자열을 입력 받아 덧셈을 실행하는 예제

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

void main() {
	string s;
	cout << "7+23+5+100+25와 같이 덧셈 문자열을 입력하세요" << endl;
	getline(cin, s, '\n');
	int sum = 0;
	int startIndex = 0;
	//문자열 내에 검색할 시작 인덱스
	while (true) {
		int findex = s.find('+', startIndex);
		if (findex == -1) {//'+'문자를 찾을 수 없음
			string part = s.substr(startIndex);
			if (part == "")break;
			cout << part << endl;
			sum += stoi(part);//문자열을 수로 변환하여 더하기
			break;
		}
		int count = findex - startIndex;
		//서브스트링으로 자를 문자 개수
		string part = s.substr(startIndex, count);
		//startIndex부터 count개의 문자로 서브스트링 만들기
		cout << part << endl;
		sum += stoi(part);//문자열을 수로 변환하여 더하기
		startIndex = findex + 1;//검색을 시작할 인덱스 전진시킴
	}
	cout << "숫자들의 합은" << sum;
}

▶ main()메소드를 분석해보자

string s;
	cout << "7+23+5+100+25와 같이 덧셈 문자열을 입력하세요" << endl;
	getline(cin, s, '\n');
	int sum = 0;
	int startIndex = 0;

▶ cin명령어로 입력받은 문자를 s에 넣는다. 이 예제의 목적인 sum과 시작 위치를 알려주는 startIndex를 0으로 초기화 시킨다.

▶다음은 while문이다. 

int findex = s.find('+', startIndex);
		if (findex == -1) {//'+'문자를 찾을 수 없음
			string part = s.substr(startIndex);
			if (part == "")break;
			cout << part << endl;
			sum += stoi(part);//문자열을 수로 변환하여 더하기
			break;

▶ 여기서는 find( ) 함수가 사용되었음을 알 수 있다. find 함수는 문자의 단어 의미 그대로 원하는 문자열을 찾는 메소드이다. s.find('+', startIndex) 메소드의 의미는 s라는 객체의 문자열 중, startIndex번째부터 시작해서 '+'라는 문자를 찾아 그 위치를 알려주세요 임을 말한다.

▶ 그렇게 하여 찾지 못하여 -1을 반환하였을 경우, startIndex번째(0번째)부터 시작하여 끝까지의 숫자를 part라는 변수에 넣고 이를 출력하도록 하여 준다(입력시 숫자와 '+'가 반복해서 입력이 되었을 텐데 +가 없다는 것은 숫자만 입력했다는 의미이기 때문)

▶ 그리고 stoi함수가 사용이 되었다. stoi함수는 이 예제의 목적인 문자열을 숫자로 바꾸는 것의 결정적인 역할을 해준다. stoi = string to int 라는 의미이다. 따라서 part에 저장된 문자열을 숫자로 바꾸어 sum에 더해준다.

 

int count = findex - startIndex;
		//서브스트링으로 자를 문자 개수
		string part = s.substr(startIndex, count);
		//startIndex부터 count개의 문자로 서브스트링 만들기
		cout << part << endl;
		sum += stoi(part);//문자열을 수로 변환하여 더하기
		startIndex = findex + 1;//검색을 시작할 인덱스 전진시킴

▶ 다음은 +가 발견이 되었을 때의 실행되는 소스코드이다.

▶ +가 있는 위치를 findex에 담았으므로 startIndex에서 findex까지는 숫자를 나타내는 문자열일 것이다. 이를 위에서처럼 part 변수에다가 넣고 이를 stoi함수를 통해 숫자로 바꾸어 sum에 더해주고 startIndex는 findex번째에 있는 '+'문자열 바로 뒤로 옮겨준다. 

 

5. 문자열을 찾고 다른 문자로 바꾸어주는 예제

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

void main() {
	string s;
	cout << "여러 줄의 문자열을 입력하세요. 입력의 끝은 &문자입니다" << endl;
	getline(cin, s, '&');
	cin.ignore();//&뒤에 따라나오는 <Enter>키를 제거하기 위한 코드
	string f, r;
	cout << endl << "find: ";
	getline(cin, f, '\n');//검색할 문자열 입력
	cout << "replace: ";
	getline(cin, r, '\n');//대체할 문자열 입력

	int startIndex = 0;
	while (true) {
		int findex = s.find(f, startIndex);//startIndex부터 문자열 f검색
		if (findex == -1) break;//문자열 s의 끝까지 변경
		s.replace(findex, f.length(), r);
		//findex부터 문자열 f의 길이만큼 문자열 r로 변경
		startIndex = findex + r.length();
	}
	cout << s << endl;
}

▶ 여기서는 replace() 함수가 사용이 되었다. s.replace(findex, f.length(), r)의 의미는 findex번째부터 검색할 문자열의 길이인 f.length()를 대체할 문자열인 r로 바꾸어라는 뜻이다.

▶ 이렇게 대체를 한 후에는, 시작하는 부분을 findex에 r.length()를 더한, 찾고자 하는 문자열 바로 다음의 문자가 있는 순번으로 옮겨준다. 

728x90
반응형