본문 바로가기

C++

[C++] string (문자열) 클래스 정리 및 사용법과 응용

반응형

 

[목차]

 

1. string 클래스란?

2. string 클래스의 입출력

3. string 클래스 생성

4. string 클래스 연산자 활용

5. string 클래스의 멤버 함수

6. string 클래스의 멤버 함수 사용 예시

 

 

  1. string 클래스란?

- C++ STL에서 제공하는 클래스로, 말 그대로 string(문자열)을 다루는 클래스이다.

- C에서는 char* 또는 char[] 의 형태로 문자열을 다뤘다면, C++에서는 문자열을 하나의 변수 type처럼 사용하며, 문자열을 훨씬 다양하고 쉽게 다룰 수 있게 해 준다. 

- char* , char[] 과 다르게 문자열의 끝에 '\0' 문자가 들어가지 않으며, 문자열의 길이를 동적으로 변경 가능하다. 

 

 

  2. string 클래스의 입/출력

C++ 입출력 방식인 cin , cout 으로 입출력이 가능하며, getline 함수도 이용할 수 있다. C에서의 scanf와 printf는 사용이 불가능하다. 

string str;         // 문자열 생성

cin >> str;          // 공백(space) 이전까지의 문자열을 입력받는다.

getline(cin, str);         // '\n' 이전까지의 문자열, 즉 한 줄을 통째로 입력받는다.  (공백 포함)

getline(cin, str, 'a')     // 'a' 문자 이전까지의 문자열을 입력받는다. getline(cin, str, '\n') == getline(cin, str)  

cout << str;        // 문자열을 출력한다.

string str;
getline(cin, str);
cout << "str : " << str << '\n';
getline(cin, str, 'd');
cout << "str : " << str << '\n';
cin >> str; 
cout << "str : " << str << '\n';
 

두번째로 "abcdef ghi" 를 입력했을 때, 'd'가 나올 때까지 문자열을 입력받아서 str에 저장하고, 그다음 cin>>str 구문은 현재까지 입력받은 위치부터 공백(space)이 나올 때 까지 입력받으므로 ef만 저장되는 것을 알 수 있다.

 

 

  3. string 클래스 생성

 - string을 이용하기 위해서는 먼저 <string> 헤더 파일을 추가해주어야 한다. 

 - string을 생성하는 방법들은 다음과 같다. 

 string str;  빈 문자열 str 생성
 string str = "abcdef";


 string str;
 str = "abcdef";
 "abcdef" 로 선언된 str 생성
 string str("abcdef");  "abcdef" 로 선언된 str 생성
 string str2(str1);  str1 문자열을 복사한 str2 생성
 char s[ ] = {'a', 'b', 'c', 'd', 'e', 'f'};
 string str(s);
 C에서의 문자열과 호환 가능
 string *str = new string("abcdef");
 new를 이용한 동적할당

 

 

  4. string 클래스 연산자 활용

* string 클래스에 <, >, ==, + 등과 같은 연산자들을 사용할 수 있다. 

- 문자열 비교 (<, >, ==) : 두 문자열의 사전 순서를 비교, 또는 동일 여부를 확인할 수 있다. 

- 문자열 연결 (+) : 두 문자열을 이어주는 역할을 한다. 

예시)

string str1 = "abcdef";
string str2 = "bbbbbb";
string str3 = "aaaa";
string str4 = "abcdef";
cout << (str1 < str2) << ' ' << (str1 < str3) << ' ' << (str1 == str4);
//1 : true , 0 : false

str1 += "A";
cout << str1 << '\n';
str1 = str1 + str2;
cout << str1 << '\n';

 

str1보다 str2가 사전 순서가 더 느리기 때문에 true(1)를 반환, str3은 사전 순서가 str1보다 더 빠르기 때문에 false(0)를 반환, str1과 str4는 문자열이 동일하기 때문에 true(1)를 반환하는 것을 볼 수 있다.

또 str1에 "A"를 더해주게 되면 "A"가 str1 맨 뒤에 붙게 되고, str2를 더해주면 str2가 str1의 맨 뒤에 붙게 되는 것도 볼 수 있다.

이처럼 C에서의 문자열보다 훨씬 간편하게 두 문자열에 대한 연산을 할 수 있다. 

 

 

 5. string 클래스의 멤버 함수

string 클래스에는 유용한 멤버 함수들이 정말 많다. 

string str; 로 선언되어있다고 가정하고 멤버 함수들을 살펴보자.

 

▶ string의 특정 원소 접근

 str.at(index) index 위치의 문자 반환. 유효한 범위인지 체크 O
 str[index] index 위치의 문자 반환. 유효한 범위인지 체크 X. 따라서 at 함수보다 접근이 빠름
 str.front() 문자열의 가장 앞 문자 반환
 str.back() 문자열의 가장 뒤 문자 반환

 

▶ string의 크기

 str.length() 문자열 길이 반환
 str.size() 문자열 길이 반환 (length와 동일)
 str.capacity() 문자열이 사용중인 메모리 크기 반환
 str.resize(n) string을 n의 크기로 만듦. 기존의 문자열 길이보다 n이 작다면 남은 부분은 삭제하고, n이 크다면 빈공간으로 채움
 str.resize(n, 'a') n이 string의 길이보다 더 크다면, 빈 공간을 'a'로 채움
 str.shrink_to_fit() string의 capacity가 실제 사용하는 메모리보다 큰 경우 낭비되는 메모리가 없도록 메모리를 줄여줌
 str.reserve(n) size = n만큼의 메모리를 미리 할당해줌
 str.empty() str이 빈 문자열인지 확인

 

▶ string에 삽입, 추가, 삭제

 str.append(str2) str 뒤에 str2 문자열을 이어 붙여줌 ('+' 와 같은 역할)
 str.append(str2, n, m) str 뒤에 'str2의 n index부터 m개의 문자'를 이어 붙여줌
 str.append(n, 'a') str 뒤에 n개의 'a'를 이어 붙여줌
 str.insert(n, str2) n번째 index 앞에 str2 문자열을 삽입함.
 str.replace(n, k, str2) n번째 index부터 k개의 문자를 str2로 대체함
 str.clear() 저장된 문자열을 모두 지움
 str.erase(n, m) n번째 index부터 m개의 문자를 지움
 str.erase(n, m) (iterator) n~m index의 문자열을 지움 (n과 m은 iterator)
 str.erase() clear와 같은 동작
 str.push_back(c) str의 맨 뒤에 c 문자를 붙여줌
 str.pop_back() str의 맨 뒤의 문자를 제거
 str.assign(str2) str에 str2 문자열을 할당. (변수 정의와 동일)

 

▶ 기타 유용한 string 멤버 함수

 str.find("abcd") "abcd"가 str에 포함되어있는지를 확인. 찾으면 해당 부분의 첫번째 index를 반환
 str.find("abcd", n) n번째 index부터 "abcd"를 find
 str.substr() str 전체를 반환
 str.substr(n) str의 n번째 index부터 끝까지의 문자를 부분문자열로 반환
 str.substr(n, k) str의 n번째 index부터 k개의 문자를 부분문자열로 반환
 str.compare(str2) str과 str2가 같은지를 비교. 같다면 0, str<str2 인 경우 음수, str>str2 인 경우 양수를 반환
 swap(str1, str2) str1과 str2를 바꿔줌. reference를 교환하는 방식
 isdigit(c) c 문자가 숫자이면 true, 아니면 false를 반환 
 isalpha(c) c 문자가 영어이면 true, 아니면 false를 반환
 toupper(c) c 문자를 대문자로 변환
 tolower(c) c 문자를 소문자로 변환

 

 

  6. string 클래스의 멤버 함수 사용 예시

 

▶ string의 특정 원소 접근

#include<iostream>
#include<string>

using namespace std;

int main(void) {
    string str = "abcdefgh";
    cout << str.at(2) << '\n';
    cout << str[4] << '\n';
    cout << str.front() << '\n';
    cout << str.back() << '\n';
}​

 

 

▶ string의 크기

#include<iostream>
#include<string>

using namespace std;

int main(void) {
    string str = "abcdefgh";
    cout << str.length() << '\n';
    cout << str.size() << '\n';
    cout << str.capacity() << '\n';
    str.resize(6); cout << str << '\n';
    str.resize(8, 'a'); cout << str << '\n';
    str.reserve(20); cout << str.capacity() << '\n';
    str.shrink_to_fit(); cout << str.capacity() << '\n';
    cout << str.empty() << '\n';
}

 

▶ string에 삽입, 추가, 삭제

#include<iostream>
#include<string>

using namespace std;

int main(void) {
    string str = "apple";
    string str2 = "banana";
    str.append(str2);            cout << str << '\n';
    str.append(str2, 1, 3);      cout << str << '\n';
    str.append(3, 'k');          cout << str << '\n';
    str.clear();                 cout << str << '\n';
    str.assign("apple");         cout << str << '\n';
    str.insert(2, str2);         cout << str << '\n';
    str.replace(3, 3, "ttt");    cout << str << '\n';
    str.erase(0, 2);             cout << str << '\n';
    str.erase();                 cout << str << '\n';
    str.push_back('a');          cout << str << '\n';
    str.push_back('b');          cout << str << '\n';
    str.pop_back();              cout << str << '\n';
}​

 

 

▶ 기타 유용한 string 멤버 함수

 
#include<iostream>
#include<string>

using namespace std;

int main(void) {
    string str = "apple";
    string str2 = "banana";
    cout << str.find("ppl") << '\n';
    cout << str.find("appl", 0) << '\n';
    cout << str.find("appl", 1) << '\n';
    cout << str.substr() << '\n';
    cout << str.substr(2) << '\n';
    cout << str.substr(1, 3) << '\n';
    cout << str.compare(str2) << '\n';
    swap(str, str2);                     cout << str << ' ' << str2 << '\n';
    cout << isdigit(str[0]) << '\n';
    cout << isalpha(str[0]) << '\n';
    toupper(str[0]);                     cout << str << '\n';
    tolower(str[0]);                     cout << str << '\n';
}

 

 

PC로 보시는 것을 권장합니다. 

피드백은 언제나 환영입니다. 댓글로 달아주세요 ^-^

반응형

'C++' 카테고리의 다른 글

[C++] vector container 정리 및 기본 사용법과 응용  (0) 2020.05.06
[C++] lower_bound & upper_bound  (0) 2020.05.06
[C++] STL - sort  (0) 2020.04.21
[C++] STL - 스택(Stack) & 큐(Queue)  (0) 2020.04.16
[C++] 입출력 ( cin / cout )  (0) 2020.04.16