출처 => 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()를 더한, 찾고자 하는 문자열 바로 다음의 문자가 있는 순번으로 옮겨준다.
'💻 개인공부 💻 > C | C++' 카테고리의 다른 글
[C++] C++에서의 데이터타입, signed와 unsigned (0) | 2020.11.08 |
---|---|
[C++] 함수와 참조 (feat. &, 별명) (0) | 2020.06.24 |
[C++] 예외 처리 (Exception) (0) | 2020.06.21 |
[C++] 조작자를 이용한 구조체 객체들의 정보 출력 프로그램(feat. struct, setw(), switch) (0) | 2020.06.21 |
[C++] 제네릭 함수 (feat. template) (0) | 2020.06.21 |