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" 이런식의 문자가 됩니다.
함수 원형 : 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'이걸 넣어주어야 합니다. 그러면 문자열 복사가 깔끔하게 되었을 겁니다.
함수 원형 : 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(5, 2, 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, 3, 5); 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은 불러주는 스트링이 사전순 뒤
감사합니다. 이번 포스팅은 역대급으로 기네요.
"구독, 좋아요"는 제게 큰 힘이 됩니다.
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] 최초값, 최대값 함수 min, max 에 대해서 (클래스, vector 사용법까지) (0) | 2019.11.22 |
---|---|
[C++] map, set의 키를 클래스 구조체로 만드는 방법 (0) | 2019.11.20 |
[C++] 파일입출력(ofstream, ifstream)에 대해서. (2) | 2019.11.18 |
[C++] reverse 문자열을 거꾸로 하는 함수에 대해서 (0) | 2019.11.13 |
[C++] string 클래스, 문자열에 대해서 (총정리) (23) | 2019.03.29 |
[C++] range based for, 범위기반 for 반복문에 대해서. (0) | 2019.03.25 |
[C++] trunc 버림 함수에 대해서 (0) | 2019.03.19 |
[C++] round 반올림 함수에 대해서. (1) | 2019.03.19 |
[C++] to_string 함수에 대해서 (int to string) (1) | 2019.03.17 |
정리하신 내용이 큰 도움이 되었습니다! 감사합니다. 공부하는데 잘쓰겠습니다!
답글
감사합니다 또방문해주세요!
항상 잘보고 있습니다. 덕분에 STL 잘 배우고 있어요 복받으세요!
답글
네 복 감사히 받겠습니다
더 좋은 정보를 가지고 기다리겠습니다
또오세요~!
str1.compare(0, 2, str2) 결과값이 0이 나오지 않는데 확인 부탁드립니다..
답글
제가 compare 함수를 잘못알고 있었네요.
내용 수정해서 올렸습니다.
잘못된 정보를 알려드려 죄송합니다.
C++ 공부하면서 구글링하다보면 여기 블로그로 자주 오게 되더라고요
내용 자세히 적어주셔서 감사합니다 큰 도움이 됐어요 ^^b
답글
C++ 어떤 주제로 검색해도 제 블로그로 올 수 있게 더 많이 작성해 두겠습니다.
감사합니다.
처음에 #include <string>을 쓰는 이유가 뭔가요??
답글
C++에서 사용하는 string 자료형과 string 관련 함수들은 <string>이라는 헤더파일에 존재하기 때문에
#include<string>이라고 작성해서 컴퓨터에게 <string> 헤더파일을 추가하라는 의미로 작성한 것 입니다.
제 북마크를 보니까 이 블로그만 보이더라구요...;; ㅋㅎㅎㅎ
항상 잘 보고 있습니다!!!!
답글
감사합니다.
그 북마크 제가 꽉 채워보겠습니다.
최고로 깔끔하고 최고로 정확한 정리
답글
칭찬 진심으로 감사합니다.
대단합니다.. String 맨날 그때그때 찾아서 쓰다가 정리하려고 했는데 완벽하네요. 감사합니다.
답글
방문 감사합니다. 또오세요
c++ 관련내용 찾으면 항상 여기가 나오네요. 공짜로 보기 아까울 정도로 정리가 잘되있는거같아요 감사합니다.
답글
칭찬 감사합니다. 또 방문해주세요.
안녕하세요. 글 잘 봤습니다.
예제 중 swap 예제가 제대로 적용이 안된 것 같아 말씀드립니다.
swap을 하지 않고 그대로 출력하고 있는 것 같아요.
답글
감사합니다. 확인 후에 수정하겠습니다.
ㄳㄳ
답글
감사합니다.
코테 준비하는데 큰 도움 받고있어요 작성자님 사랑합니다~🥰
답글