본문 바로가기
<개인공부>/[C++]

[C++] string 클래스, 문자열에 대해서 (총정리)

by 사용자 BlockDMask 2019. 3. 29.
반응형
안녕하세요 BlockDMask 입니다.
오늘은 C++의 std::string 클래스(문자열)에 대해서 세세 하게 알아볼것 입니다.
예전 글을 보다가 제가 작성한 이 문서를 보게 되었는데요, 너무 내용이 빈약하다고 생각해서 리뉴얼 하게 되었습니다.
문자열 관련 특정 함수 예제만 보실분들은 아래 예제들에서 사용한 멤버 함수들을 적어 두었으니 해당 예제로 바로 내려가시면 됩니다. (저 잘했쥬?)
<목차>
1. C++ string 클래스 헤더파일과 설명 그리고 생성하는 방법.
2. C++ string 클래스 멤버함수 거~의 대부분 정리 (꼼꼼하게 작성했습니다.)
-> at(), operator[], front(), back()
-> size(), length(), capacity(), resize(), shrink_to_fit(), reserve(), clear(), empty()
-> c_str(), substr(), replace(), compare(), copy(), find(), push_back(), pop_back()
-> begin(), end()
-> swap(), operator+
3. C++ string 클래스 예제1 (생성과 출력, 문자열 연결, push_back, pop_back)
3. C++ string 클래스 예제2 (size, capacity, length, clear)
4. C++ string 클래스 예제3 (substr, replace, swap)
5. C++ string 클래스 예제4 (find, operator[], at, front, back)
6. C++ string 클래스 예제5 (begin, end, copy, compare)

1. C++ string 클래스 헤더파일과 설명 그리고 string을 생성하는 여러가지 방법.


▼ string 클래스 헤더파일, 생성방법

헤더파일 : <string>

생성1     string str("BlockDMask");

생성2     string str1;

  str1 = "BlockDMask";

생성3     : string str2(str1);

(using namespace std; 를 추가해주어야 합니다.)


string 클래스는 말씀드린것 처럼 string을 다루는 클래스 입니다.

또한, C언어의 char*, char[] 문자열과 달리, 문자열끝에 '\0'이런게 들어있지 않습니다.

자 그럼 C++ string 에서는 어떤 편리한 기능이 있는지 살펴보러 가겠습니다.


2. C++ string 클래스 멤버함수 정리 (거의 대부분)


std::string 에는 문자열을 다루는 정말 여러 멤버 함수들이 존재합니다. 우리는 이 멤버함수들을 적절하게 사용하여 원하는 프로그램을 만들면 됩니다.


♣ 중요중요

string str1 = "BlockDMask"; 

string str2 = "BlogBlogBlogBlog"; 인 상태에서 시작하겠습니다.

하나의 멤버함수 내에서 예시들은 이어지게되고.

각 멤버 변수가 시작할때 str1, str2는 처음과 같이 초기화 되었다고 가정하겠습니다.


 string 인자 접근, access 관련

 str1.at(index)

함수 원형 : char& at (size_t index);

함수 설명 : index(=인덱스) 에는 숫자가 들어가게되고, 해당 위치(n)에 해당하는 문자를 반환합니다. 

  index는 0부터 시작합니다. index가 string의 범위를 벗어나게 되면 예외를 뱉습니다.

함수 예시 : str1.at(0);    //"BlockDMask" -> 'B'를 리턴합니다.


 str1.operator[index]

함수 원형 : char& operator[](size_t index);

함수 설명 : C++ string은 일반 배열처럼 대괄호를 이용해서 string 인자에 접근할 수 있습니다. 

  at과 다른점은 string의 index(인덱스)범위를 검사하지 않기 때문에 at 함수보다는 빠릅니다. 하지만 예외를 뱉어내지 않습니다. 

  index는 0부터 시작합니다. index 번째 인자를 반환합니다.

함수 예시 : str1[1];    //"BlockDMask" -> 'l'를 리턴합니다.


 str1.front();

함수 원형 : char& front();

함수 설명C++11부터 가능합니다. string의 맨 앞 인자를 반환합니다.

함수 예시 : str1.front();    //"BlockDMask" -> 'B'를 리턴합니다.


 str1.back();

함수 원형 : char& back();

함수 설명 : C++11부터 가능합니다. string의 맨 뒤 인자를 반환합니다. 

  개인적으로 front는 모르겠지만 back은 참 좋은 멤버변수인것 같습니다. 우리가 string의 첫번째 인자를 가지려고 할때는 str1[0]을 인덱스로 집어 넣으면 되지만 끝부분은 대부분 다른 멤버변수에 저장을 해놓거나 잘 모르는 경우가 많습니다. 그렇기 때문에 back() 을 이용하면 편하게 맨 뒤 인자를 가지고 올 수 있습니다.

함수 예시 : str1.back();    //"BlockDMask" -> 'K'를 리턴합니다.


 string size 관련

str1.size();

함수 원형 : size_t size() const;

함수 설명 : string의 사이즈를 반환합니다.

함수 예시 : str1.size();    // "BlockDMask" 이므로 10을 반환합니다.


 str1.length();

함수 원형 : size_t length() const;

함수 설명 : string의 길이를 반환합니다. size() 함수와 같다고 생각하면 됩니다.

함수 예시 : str1.length();    // "BlockDMask" 이므로 10을 반환합니다.


 str1.capacity();

함수 원형 : size_t capacity() const;

함수 설명 : string 객체에 할당된 메모리 크기(bytes)를 반환합니다. 

  capacity는 vector의 capacity와 마찬가지로 스트링 길이가 증가할 수 있기 때문에, 메모리 할당을 size에 대비해서 여유롭게 합니다. 

  size가 capacity를 넘게 될때 새롭게 더 큰 capacity(메모리)를 할당합니다.

함수 예시 : str1.capacity();    // "BlockDMask" 길이는 10인데 capacity는 15 입니다.

함수 예시 : str2.capacity();    // "BlogBlogBLogBlog" 길이는 16인데 capacity는 31 입니다.


15 -> 31 이런식으로 스트링의 capacity가 넘어가는 것을 알 수 있습니다.

길이가 10 인 스트링을 우리가 str1 += "a"  이런식으로 계속해서 길이를 늘리다가 16이 되는순간 기존의 capacity를 넘어가므로 더 큰 capacity를 할당하여서 스트링을 다루게 됩니다.


 str1.resize(n);

함수 원형 : void resize (size_t n);

함수 원형 : void resize (size_t n, char c);

함수 설명 : string을 n만큼의 크기로 만듭니다. 

  만약 그 크기가 원래 사이즈 보다 작다면, 남은 스트링을 버립니다. 

  만약 그 크기가 원래 사이즈 보다 크다면, 빈 공간으로 남은 공간을 채웁니다. 만약 c를 사용한다면 남은 공간을 c로 채울 수 있습니다.

함수 예시 : str1.resize(5)    // "BlockDMask" -> "Block" 이 됩니다. size는 5입니다.

함수 예시 : str1.resize(6)    // "Block" -> "Block " 가 됩니다. 빈칸이 있습니다. size는 6이 되었습니다.

함수 예시 : str1.resize(10, 'a') // "Block " -> "Block aaaa" 가 됩니다. 사이에 빈칸이 하나 있는거 보이시죠? q 추가했던 그것입니다.


 str1.shrink_to_fit();

함수 원형 : void shrink_to_fit();

함수 설명 : C++11 입니다. 이 함수는 스트링 길이에 비해 낭비되고 있는 capacity(메모리)를 줄이는 함수입니다. 

함수 예시 : str2.resize(4);    // "BlogBlogBlogBlog" -> "Blog" 가 됩니다. 아까 capacity에서 보자면 길이가 16짜리 string의 capacity는 31 이었습니다.

함수 예시 : str2.shrink_to_fit();    // "Blog" 처럼 길이가 4가 된 스트링의 capacity에 알맞게 str2의 capacity가 31에서 16으로 줄어들게 됩니다.


 str1.reserve(n);

함수 원형 : void reserve(size_t n = 0);

함수 설명 : 문자열을 넣기 전에 미리 "곧 n만큼의 크기의 스트링이 들어올거니까 그에 맞는 capacity를 할당해 달라"는 함수 입니다.

  이건 보통 파일을 읽을 때 사용을 하는데요, 3000자 짜리 파일을 우리가 읽게 된다하면, 파일에 있는 글을 한자씩 가지고 오게되는데 이게 while문에서 eof를 이용해서 파일의 끝 까지 읽게 됩니다. 이런 경우에는 미리 메모리를 할당해서, capacity가 사이즈에 맞게 계속 늘어나는 행위를 덜하게해서 성능저하를 줄이게 하는 것 입니다.

  만약에 reserve를 하지 않고 그냥 파일을 읽는다면 아마 이렇게 될 것 입니다. str += "글" 이렇게 계속 파일이 끝이 나올 때 까지 더해질 것이고, str의 길이가 16이 되면 새롭게 capacity를 늘리는 작업이 들어가서 비용이 들게되고, 또 str의 길이가 32가 되면 새롭게 capacity를 늘리는 작업이 들어가게 되고....... 계속 .... 계속.... 늘리는 작업을 하게 됩니다. 이런 비효율적인 작업을 하지 않게 하려고 미리 메모리 예약을 하는 것 입니다.

  쉽게 말해서 노래방에 2인실을 갔는데, 2명이 더와서 4인실을 갔는데 또 여러명이 와서 8인실을 가고 이렇게 사람들이 이동하는 동안 우리는 노래를 못부르고 시간이 줄잖아요. 컴퓨터도 마찬가지 입니다 한번 할당해 놓은 메모리를 또 추가로 할당한다는 것은 그만큼 비용이 생기게 됩니다.


 str1.clear();

함수 원형 : void clear();

함수 설명 : 스트링에 들어있는 문자열을 지우는 함수입니다. 이때, size와 length는 0이 되고, capacity는 그대로 남게 됩니다.

함수 예시 : str1.clear();    //"BlockDMask" -> "" 이 됩니다. size와 lenth는 0이 되고, capacity는 15 그대로 입니다. (메모리 해제가 아닌 문자열 값들을 삭제하는것)


 str1.empty();

함수 원형 : bool empty() const;

함수 설명 : 스트링이 비었는지 확인하는 함수입니다. 비었으면 true를 반환합니다. 비었음의 기준은 size, length가 0인 것 입니다. capacity와는 관계가 없습니다.

함수 예시 : if(str1.empty()) { return true; }    //이런식으로 비었는지 확인하면됩니다. clear를 사용하고 empty를 사용하면 당연히 true 겠죠?


 string 가지고 놀기 종류

 str1.c_str()

함수 원형 : const char* c_str() const;

함수 설명 : C++ 스타일의 string 문자열을 C스타일의 문자열로 변경해주는 함수입니다. 

함수 예시 : const char* arr = str1.c_str();    // "BlockDMask"가 "BlockDMask\0"로 반환해 줍니다. C언어에서 처럼 사용할 수 있습니다.


 str1.substr(....)

함수 원형 : string substr(size_t index = 0, size_t len = npos) const;

함수 설명 : string을 index 에서부터 len만큼 잘라서 반환하는 함수입니다. 스트링 짤라서 반환.

  두번째 인자의 len의 디폴트 npos가 의미하는 것은 "-1"입니다. size_t의 타입은 unsigned int 타입입니다.

  그 unsigned int에 -1이 들어온다? 그게 무슨의미 일까요? 맞습니다.

  "언더플로우" 입니다. unsigned인 타입에 음수를 넣으면 제일 큰 값으로 세팅이 됩니다. 

  그렇기 때문에 npos에는 -1을 넣어서, 아무것도 넣지 않았을때는 항상 문자열이 길어질 수 있는 최대의 길이를 나타내게 됩니다.

함수 예시 : str1.substr();          //"BlockDMask" 그대로 반환합니다.

함수 예시 : str1.substr(5);        // "DMask"를 반환합니다. 0부터 세기 시작해서 "5" 번째 인자부터 끝까지의 문자열을 반환합니다.

함수 예시 : str1.substr(5, 1);     // "D"를 반환합니다. 5번째 인자부터, 1의 길이만큼 문자열을 반환합니다.


 str1.replace(....)

함수 원형 : string& replace(size_t index, size_t len, const string& str)

함수 설명 : 함수를 호출하는 문자열의 index위치에서 len 길이까지의 범위를 매개변수로 들어온 str 전체로 대체 하는 함수입니다.

함수 예시 : str1.replace(5, 2, str2);

// "BlockDMask"의 5번째 인자에서부터 2개를 str2로 대체하게 됩니다. 그러면 "BlockBlogBlogBlogBlogask" 이런식의 문자가 됩니다.


 str1.compare(....)

함수 원형 : int compare(const string& str2) const;

함수 원형 : int compare(size_t index, size_t len, const string& str2) const;

함수 원형 : int compare(size_t index, size_t len, const string& str2, size_t index2, size_t len2) const;


함수 설명 : 매개변수로 들어온 str을 비교해서 같으면 0을 반환하고, 다르면 0이 아닌 값을 반환하는 함수입니다.

  호출하는 스트링의 값이 매개변수로 들어온 스트링의 값보다 작을때(사전순 빠를때) 음수(-1)를 반환하고

  호출하는 스트링의 값이 매개변수로 들어온 스트링의 값보다 클때(사전순 느릴때) 양수(1)를 반환합니다

함수 예시 : str1.compare(str2);    // "BlockDMask", "BlogBlogBLogBLog"는 같지 않기 때문에 0이 아닌 값을 반환하고, Blo까지는 둘이 똑같고, 그다음 c, g를 비교하게 됩니다. 이때, c가 g보다 사전상 더 앞선글자이기 때문에 c가 더 작은 글자가 됩니다. 그렇기 때문에 음수(-1)를 반환하게 됩니다.

함수 예시 : str2.compare(str1);    // 이거는 그럼 양수(1)을 반환하겠죠?

함수 예시 : str1.compare("BlockDMask");    //이 경우에는 두 스트링이 같기 때문에 0을 반환합니다.

함수 예시 : str1.compare(0, 2, str2);    // str1인 "BlockDMask"의 0번째 인덱스 부터 길이가 2인 문자열 "Bl"과 str2인 "BlogBlogBlogBlog" 를 비교합니다. 두 문자열이 다르기 때문에 0이 아닌 수를 반환합니다.

함수 예시 : str1.compare(0, 2, str2, 4, 2); //str1의 "BlockDMask"의 0번째 인덱스 부터 길이 2인 문자열 "Bl"과 str2 문자열 "BlogBlogBlogBlog" 3번째 인덱스 부터 길이가 2인 문자열인 "Bl"을 비교합니다. 비교할 문자열이 같기 때문에 0을 반환합니다.


 str1.copy(....)

함수 원형 : size_t copy(char* arr, size_t len, size_t index = 0) const;

함수 설명 : 딱봐도 복사를 하는 함수입니다. 이거는 특이하게 길이는 나타내는 len이 두번째고, index가 세번째 인자입니다. 아무래도 시작하는곳이 더 중요하지 않다고 판단하고 디폴트 인자를 설정해주려고 맨뒤로 보낸걸로 보입니다.

  첫번째 매개변수 : 호출한 문자열을 첫번째 매개변수 문자열에 복사하는 함수입니다. char* 인걸 보면, C언어의 문자열(배열타입)을 받습니다.

  두번째 매개변수는 복사할 문자열의 길이를 나타냅니다.

  세번째 매개변수는 복사를 시작할 위치 입니다. index는 0부터 시작하는거 아시죠?

  마지막으로 실제로 복사된 길이, arr의 길이를 반환합니다.

함수 예시 : char arr[10];    //문자열을 복사해서 넣을 빈 배열을 만듭니다.

함수 예시 : int arrLen = str1.copy(arr, 3, 5);    //5번째 index부터 3의 길이만큼 복사 한다는 거니까 "BlockDMask" 빨간 부분이 들어갔을겁니다. 그리고 반환하는 arrLen은 3의 길이겠죠?

함수 예시 : arr[arrLen] = '\0';    //그리고 C의 문자열의 끝에는 '\0'이걸 넣어주어야 합니다. 그러면 문자열 복사가 깔끔하게 되었을 겁니다.


 str1.find(....)

함수 원형 : size_t find (const string& str, size_t index = 0) const;

함수 원형 : size_t find (const char* arr, size_t index = 0) const;

함수 설명 : 매개변수로 들어온 문자열과, 내 문자열중에 일치하는 게 있는지 확인하는 함수입니다. 

  만약에 일치하는게 있다면, 일치하는 부분의 첫번째 순서(index)를 반환합니다.

  두번째 매개변수로 들어온 index는 어느 위치에서 부터 찾을까 입니다.

함수 예시 : str2.find("Blog");    // "BlogBlogBlogBlog" -> 0 을 반환합니다.

함수 예시 : str2.find("Blog", 5);    // 5번째 인자부터 blog를 찾게되니 BlogBlogBlogBlog 빨간색 l에서부터 찾게되므로 그 다음에 나오는 b의 위치인 8을 반환할 것 입니다.


 str1.push_back(c)

함수 원형 : void push_back(char c);

함수 설명 : 함수를 호출하는 스트링의 맨뒤에 문자 c를 더하는 함수 입니다.

함수 예시 : str1.push_back('a');    //"BlockDMask" -> "BlockDMaska" 'a'가 하나 더해집니다.


 str1.pop_back()

함수 원형 : void pop_back()

함수 설명 : 함수를 호출하는 스트링의 맨뒤에 있는 문자 하나를 없애는 함수 입니다.

함수 예시 : str1.pop_back();    // "BlockDMask" -> "BlockDMas" 이렇게 k가 하나 빠집니다.


 string iterator 종류

 str1.begin();

함수 원형 : iterator begin();

함수 원형 : const_iterator begin() const;

함수 설명 : 문자열의 첫 번째 문자를 가리키는 반복자(iterator 포인터)를 반환합니다.


 str1.end();

함수 원형 : iterator end();

함수 원형 : const_iterator end() const;

함수 설명 : 문자열의 마지막의 바로 다음을 가리키는 반복자(iterator 포인터)를 반환합니다. (잘 봐야해요 문자열 끝이 아니라 그 다음!)


iterator는 보통 순회를 할때 많이 사용합니다. 아래와 같은 방식으로 많이 쓰죠.

아래와 같이 하면, B 엔터 l 엔터 이런식으로 한글자씩 나오게 됩니다.

1
2
3
4
for (string::iterator iter = str1.begin(); iter != str1.end(); ++iter)
{
    cout << *iter << endl;
}
cs


 string의 기타등등.

 swap(str1, str2);

함수 원형 : void swap(string& str1, string& str2);

함수 설명 : str1과 str2를 바꾸는 것 입니다. 

  스왑을 할때 복사를 해서 스왑을 하는것이 아니라 서로 참조(reference)를 교환해서 스왑을 합니다. 

  그렇기 때문에 복사에 의한 성능저하를 우려할 필요가 없습니다.

함수 예시 : swap(str1, str2);    //str1이 "blog~~"가 되고, str2가 "BlockDMask"가 됩니다.


 operator+

함수 설명 : 이거는 오퍼레이터 +인데요. string끼리 더할 수 있습니다. 더한다는 의미는 이어 붙인다는 것 입니다.

  이미 만들어져 있는 것이라, 우리가 그냥 string끼리 더해서 사용하면 됩니다. 

함수 예시 : str1 += str2;    //str1은 "BlockDMaskBlogBlogBlogBlog" 이런식으로 만들어집니다.


3. C++ string 클래스 예제1 (생성과 출력, 문자열 연결, push_back, pop_back)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//C++ string example1
//BlockDMask.
#include<iostream>
#include<string>
using namespace std;
 
int main()
{
    string str1 = "BlockDMask";
    string str2("BlogBlogBlogBlog");
    string str3(str1);
 
    //string을 생성하는 다양한 방법.
    cout << "==> onstructor" << endl;
    cout << "str1 = \"BlockDMask\" \n : " << str1 << endl << endl;
    cout << "str2(\"BlogBlogBlogBlog\") \n : " << str2 << endl << endl;
    cout << "str3(str1) \n : " << str3 << endl << endl;
 
    //push_back, pop_back
    cout << endl;
    cout << "==> string front, back example." << endl;
    str1.push_back('1');
    cout << "str1.push_back('1') : " << str1 << endl;
    str1.push_back('2');
    cout << "str1.push_back('2') : " << str1 << endl;
    str1.pop_back();
    cout << "str1.pop_back() :  " << str1 << endl;
    str1.pop_back();
    cout << "str1.pop_back() :  " << str1 << endl;
    str1.pop_back();
    cout << "str1.pop_back() :  " << str1 << endl;
 
    //operator+ stirng 덧셈.
    cout << endl;
    cout << "==> str1 += str2" << endl;
    str1 += str2;
    cout << str1 << endl;
           
    cout << endl;
    system("pause");
    return 0;
}
cs


▲ C++ string 예제1 (생성과 출력, 문자열 연결, push_back, pop_back)

stirng을 생성하는 3가지 방법에 대한 예제

그리고 string끼리 연결하기, 더하기, 맨뒤에 문자 추가하기, 맨뒤에있는 문자 뺴기


4. C++ string 클래스 예제2 (size, capacity, length, clear, shrink_to_fit)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//C++ string example2
//BlockDMask.
#include<iostream>
#include<string>
using namespace std;
 
int main()
{
    string str2 = "BlogBlogBlogBlog";
 
    cout << "==> str2 original" << endl;
    cout << "str2 : " << str2 << endl;
    cout << "str2.size() : " << str2.size() << endl;
    cout << "str2.length() : " << str2.length() << endl;
    cout << "str2.capacity() : " << str2.capacity() << endl;
    
    cout << endl;
    str2.resize(4);
    cout << "==> str2.resize(4)" << endl;
    cout << "str2 : " << str2 << endl;
    cout << "str2.size() : " << str2.size() << endl;
    cout << "str2.length() : " << str2.length() << endl;
    cout << "str2.capacity() : " << str2.capacity() << endl;
 
    cout << endl;
    str2.shrink_to_fit();
    cout << "==> str2.shrink_to_fit()" << endl;
    cout << "str2 : " << str2 << endl;
    cout << "str2.size() : " << str2.size() << endl;
    cout << "str2.length() : " << str2.length() << endl;
    cout << "str2.capacity() : " << str2.capacity() << endl;
 
    cout << endl;
    str2.clear();
    cout << "==> str2.clear()" << endl;
    cout << "str2 : " << str2 << endl;
    cout << "str2.size() : " << str2.size() << endl;
    cout << "str2.length() : " << str2.length() << endl;
    cout << "str2.capacity() : " << str2.capacity() << endl;
 
    cout << endl;
    system("pause");
    return 0;
}
cs


▲ C++ string 예제2 (size, capacity, length, clear, shrink_to_fit)

1. string에서 size와 length가 같은지.

2. string에서 capacity가 무엇인지.

3. resize(), shrink_to_fit() 함수와 clear() 함수도 살펴봐 주세요.


5. C++ string 클래스 예제3 (substr, replace, swap)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//C++ string example3.
//BlockDMask.
#include<iostream>
#include<string>
using namespace std;
 
int main()
{
    string str1 = "BlockDMask";
    string str2 = "BlogBlogBlogBlog";
 
    cout << "str1 : " << str1 << endl;
    cout << "str2 : " << str2 << endl;
    cout << endl;
    
    //string substr example.
    cout << "str1.substr(5) : " << str1.substr(5<< endl;
    cout << "str1.substr(5,1) : " << str1.substr(5,1<< endl;
    
    //string replace example.
    cout << "str1.replace(5, 2, str2) : " << str1.replace(52, str2) << endl;
 
    //string swap example.
    cout << endl;
    string str3 = "C++ example";
    cout << "str2 : " << str2 << endl;
    cout << "str3 : " << str3 << endl;
 
    cout << endl;
    cout << "swap(str2, str3)" << endl;
    cout << "str2 : " << str2 << endl;
    cout << "str3 : " << str3 << endl;
 
    cout << endl;
    system("pause");
    return 0;
}
cs


▲ C++ string 예제3 (size, capacity, length, clear, shrink_to_fit)

1. str1의 substr(5) : index가 5번째인 값부터 끝까지 문자열을 반환.

2. str1의 substr(5,1) : index가 5번째인 값부터 1 길이의 문자열을 반환.

3. str1.replace(5, 2, str2) : str1의 5번째인 자리부터 2개의 문자열을 str2문자열 전체로 대체.

4. swap(str2, str3) : str2와 str3의 참조를 서로 바꾸어줌.


6. C++ string 클래스 예제4 (find, operaotr[], at, front, back)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//C++ string example4.
//BlockDMask.
#include<iostream>
#include<string>
using namespace std;
 
int main()
{
    string str1 = "BlockDMask";
    string str2 = "BlogBlogBlogBlog";
 
    cout << "str1 : " << str1 << endl;
    cout << "str2 : " << str2 << endl;
    cout << endl;
 
    //find
    cout << "==> string find example." << endl;
    cout << "str1.find(\"DM\") : " << str1.find("DM"<< endl;
    cout << "str2.find(\"Blog\") : " << str2.find("Blog"<< endl;
    cout << "str2.find(\"Blog\", 5) : " << str2.find("Blog"5<< endl;
 
    //operator[], at
    cout << endl;
    cout << "==> string operator[], at() example." << endl;
    cout << "str1[0] : " << str1[0<< endl;
    cout << "str1[3] : " << str1[3<< endl;
    cout << "str1[str1.size()-1] : " << str1[str1.size() - 1<< endl;
    cout << endl;
    cout << "str1.at(0) : " << str1.at(0<< endl;
    cout << "str1.at(3) : " << str1.at(3<< endl;
    cout << "str1.at(str1.size()-1) : " << str1.at(str1.size() - 1<< endl;
 
    //front, back
    cout << endl;
    cout << "==> string front, back example." << endl;
    cout << "str1[0] : " << str1[0<< endl;
    cout << "str1.at(0) : " << str1.at(0<< endl;
    cout << "str1.front() : " << str1.front() << endl;
    cout << endl;
    cout << "str1[str1.size()-1] : " << str1[str1.size() - 1<< endl;
    cout << "str1.at(str1.size()-1) : " << str1.at(str1.size() - 1<< endl;
    cout << "str1.back() : " << str1.back() << endl;
 
    cout << endl;
    system("pause");
    return 0;
}
cs


▲ C++ string 예제4 (find, operator[], at, front, back)

1. find의 사용법.

2. string 인자 접근법. 

3. 그리고.. 맨앞과 맨 끝 접근법.

front vs str1[0]

back vs str1[str1.size()-1]

어떤걸 사용하시든, 개발하시는분 마음이지만 이왕이면 저는 front와 back을 추천합니다.


7. C++ string 클래스 예제5 (begin, end, copy, compare)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//C++ string example5
//BlockDMask.
#include<iostream>
#include<string>
using namespace std;
 
int main()
{
    string str1 = "BlockDMask";
    string str2 = "BlogBlogBlogBloc";
 
    cout << "str1 : " << str1 << endl;
    cout << "str2 : " << str2 << endl;
    cout << endl;
 
    //begin, end
    cout << "==> begin, end" << endl;
    string::iterator iter = str1.begin();
    for (; iter != str1.end(); ++iter)
    {
        cout << *iter << " ";
    }
    cout << endl;
 
    //copy
    cout << endl;
    cout << "==> copy " << endl;
    char arr[10];
    int arrLen = str1.copy(arr, 35);
    cout << "str1.copy(arr, 3, 5)" << endl;
    cout << "arrLen : " << arrLen << endl;
    cout << arr << endl;    //error.
    arr[arrLen] = '\0';
    cout << arr << endl;    //ok.
 
    //compare
    cout << endl;
    cout << "==> compare" << endl;
    cout << "str1.compare(\"BlockDMask\") : " << str1.compare("BlockDMask"<< endl;
    cout << "str1.compare(str2) : " << str1.compare(str2) << endl;
    cout << "str2.compare(str1) : " << str2.compare(str1) << endl;
    cout << endl;
    system("pause");
    return 0;
}
cs


▲ C++ string 예제4 (find, operator[], at, front, back)

1. begin, end 반복자를 이용한 순회

2. copy를 했을때는 꼭 맨뒷자리에 '\0'을 잊지말아주세요. 저기 DMa 뒤에 쓰레기값이 들어가는거 보이시죠? 

  C언어에서, char 배열에서 문자열의 끝은 '\0' 한번 더 강조합니다.

3. compare는 같으면 0, 다르면 -1, 1 입니다. 

  -1은 불러주는 스트링이 사전순 앞

   1은 불러주는 스트링이 사전순 뒤


감사합니다. 이번 포스팅은 역대급으로 기네요.

"구독, 좋아요"는 제게 큰 힘이 됩니다.


반응형

댓글23