• Home
  • About
    • back
    • Seokmin.Lee photo

      Seokmin.Lee

      Hello, I am a master's student in the Department of Convergence Security (Samsung Advanced Security) at Korea University.After graduation, I am expected as a security developer or researcher member of Samsung SDS.

    • Learn More
    • LinkedIn
    • Github
  • Posts
    • back
    • All Tags

[ps][cpp_stl]4_string

08 Feb 2025

4. String ★★★

4.1 method 활용 예제

#include <iostream>
#include <string>

using namespace std;

int main() {
    // 1️⃣ 문자열 선언
    string str = "Hello, World!";

    // 2️⃣ size: 문자열의 길이 (문자 수) 반환
    cout << "문자열 길이 (size): " << str.size() << endl;
    // 출력: 문자열 길이 (size): 13

    // 3️⃣ clear: 문자열 비우기
    str.clear();
    cout << "clear() 후 문자열 길이: " << str.size() << endl;
    // 출력: clear() 후 문자열 길이: 0

    // 4️⃣ empty: 문자열이 비어있는지 확인
    cout << "문자열이 비어있는지 확인 (empty): " << (str.empty() ? "비어 있음" : "비어 있지 않음") << endl;
    // 출력: 문자열이 비어있는지 확인 (empty): 비어 있음

    // 문자열을 다시 설정
    str = "Hello, World!";

    // 5️⃣ substr: 문자열의 부분 문자열 추출
    string sub_str = str.substr(7, 5); // 인덱스 7부터 5글자 추출
    cout << "부분 문자열 (substr): " << sub_str << endl;
    // 출력: 부분 문자열 (substr): World

    // 6️⃣ find: 특정 문자열을 찾기 (찾으면 인덱스를 반환, 못 찾으면 -1 반환)
    size_t found = str.find("World");
    if (found != string::npos) {
        cout << "'World'가 발견된ㅏ 위치: " << found << endl;
    } else {
        cout << "'World'를 찾을 수 없음" << endl;
    }
    // 출력: 'World'가 발견된 위치: 7

    // 7️⃣ insert: 특정 위치에 문자열 삽입
    str.insert(5, " Beautiful");
    cout << "insert() 후 문자열: " << str << endl;
    // 출력: insert() 후 문자열: Hello Beautiful, World!

    // 8️⃣ erase: 특정 위치부터 문자열 지우기
    str.erase(5, 11); // 인덱스 5부터 11개의 문자 삭제
    cout << "erase() 후 문자열: " << str << endl;
    // 출력: erase() 후 문자열: Hello, World!

    return 0;
}

  • 정리

    함수 설명
    size() 문자열의 길이(문자의 개수)를 반환.
    clear() 문자열을 비운다. 길이가 0이 된다.
    empty() 문자열이 비어 있는지 확인. 비어 있으면 true, 아니면 false.
    substr(pos, len) 주어진 위치(pos)부터 len 길이만큼의 부분 문자열을 반환.
    find(str) 특정 문자열 str을 찾고, 첫 번째 발생 위치의 인덱스를 반환. 못 찾으면 string::npos를 반환.
    insert(pos, str) 문자열의 pos 위치에 문자열 str을 삽입.
    erase(pos, len) pos 위치부터 len 길이만큼의 문자열을 삭제.

4.2 생각할 Insight

4.2.1. Q.string 자료구조의 구성

string은 C++ 표준 라이브러리에서 제공하는 문자열 클래스. 내부적으로는 동적 배열을 사용하여 문자열을 저장하고 있습니다. string은 내부적으로 char 배열을 관리하며, 문자열을 동적으로 처리할 수 있는 다양한 기능을 제공합니다. 일반적으로 string의 내부 구조는 다음과 같습니다:

  • 동적 배열 (Dynamic Array): 문자열의 데이터를 저장하는 메모리 공간.
  • 문자열 길이: 현재 문자열의 길이를 저장하는 변수.
  • 메모리 관리: 문자열이 변경될 때, 크기를 자동으로 확장하거나 축소하는 메커니즘이 포함되어 있습니다. string은 버퍼링 기법을 사용하여 성능을 최적화합니다. 예를 들어, 문자열의 크기가 커지면 일괄적으로 버퍼를 확장하고, 줄어들면 메모리를 줄일 수 있습니다.

4.2.2. Q.string과 char*의 차이

  • string: C++에서 제공하는 클래스 형태의 문자열입니다. 동적 메모리를 사용하여 문자열의 크기를 자동으로 관리합니다. 메모리 할당, 크기 조정, 문자열 조작 기능을 내장하고 있어 다양한 편리한 메서드를 제공합니다.

    예시:

      string str = "Hello, World!";
    
  • char*: C 스타일 문자열로, 문자 배열의 포인터입니다. 문자열의 끝은 널 문자 '\0'로 구분되며, 크기를 따로 추적하지 않으므로 사용자가 직접 메모리 관리와 크기 조정을 해야 합니다.

    예시:

      char* str = "Hello, World!";
    

차이점:

  • 메모리 관리: string은 메모리를 자동으로 관리하며, char*는 메모리 관리가 수동적입니다.
  • 편의성: string은 문자열 길이 추적, 동적 확장, 복잡한 문자열 조작을 쉽게 할 수 있는 다양한 메서드를 제공합니다. 반면, char*은 문자열 크기 및 메모리 관리를 사용자가 직접 해야 하므로 더 복잡합니다.
  • 안전성: string은 메모리 오버플로우를 방지하는 기능을 제공하지만, char*은 안전하지 않으며 버퍼 오버플로우 문제를 유발할 수 있습니다.

4.3.3. Q. string과 char* 간의 변환 방법

  • string에서 char*로 변환

string을 char*로 변환하려면 string::c_str() 메서드를 사용하여 C 스타일 문자열을 얻을 수 있습니다. 이때 반환된 char*는 읽기 전용입니다.

string str = "Hello, World!";
const char* cstr = str.c_str();
  • char*에서 string으로 변환

char*를 string으로 변환하려면 string 생성자를 사용하여 쉽게 할 수 있습니다.

char* cstr = "Hello, World!";
string str(cstr);

4.3.4. Q. string 값 변경 (수정, append, 중간 수정 등)

string에서는 다양한 방법으로 문자열 값을 변경할 수 있습니다:

  • 수정 (수정 가능한 문자 참조)

문자열의 특정 위치에 있는 문자를 변경하려면 [] 연산자를 사용하거나, at() 메서드를 사용할 수 있습니다. (인덱스가 범위를 벗어나면 at()은 예외를 던집니다.)

string str = "Hello, World!";
str[7] = 'w';  // 특정 문자 수정
// str == "Hello, world!"
  • append (문자열 추가)

string에 문자열을 추가하려면 append() 또는 += 연산자를 사용할 수 있습니다.

string str = "Hello";
str.append(", World!");
// 또는
str += "!!!";
// str == "Hello, World!!!"
  • 중간 문자열 수정 (insert, erase)

문자열 중간에 삽입하거나 삭제하려면 insert()와 erase() 메서드를 사용할 수 있습니다.

string str = "Hello, World!";
str.insert(5, ", Beautiful");
// str == "Hello, Beautiful World!"
str.erase(5, 10);  // 인덱스 5부터 10글자 삭제
// str == "Hello World!"

4.3.5. Q.substr 메서드 동작 및 타겟 길이를 모를 때 중간부터 끝까지 검색하기

substr()는 문자열의 일부를 추출하는 메서드입니다. 두 가지 매개변수를 가질 수 있습니다:

  • pos: 시작 위치 (0부터 시작)
  • len: 추출할 길이

만약 길이를 모를 경우, substr의 두 번째 매개변수를 생략하거나 string::npos를 사용하여 문자열의 끝까지 추출할 수 있습니다.

-예시 1: substr을 사용하여 특정 위치부터 끝까지 추출

string str = "Hello, World!";
string sub = str.substr(7);  // 인덱스 7부터 끝까지 추출
cout << sub << endl;  // 출력: World!

-예시 2: 길이를 모를 때, 문자열의 끝까지 추출하기

string str = "Hello, World!";
string sub = str.substr(7, string::npos);  // 인덱스 7부터 끝까지
cout << sub << endl;  // 출력: World!

string::npos는 문자열의 끝을 나타내는 값으로, 이를 사용하면 문자열의 끝까지 자를 수 있습니다.

-중간부터 끝까지 검색하기

만약 substr을 사용하여 중간부터 끝까지의 문자열을 추출하려면, 시작 인덱스를 find() 메서드를 이용하여 검색한 후 해당 인덱스에서부터 끝까지 추출할 수 있습니다.

string str = "Hello, World!";
size_t pos = str.find("World");  // "World"라는 부분 문자열을 찾음
if (pos != string::npos) {
    string sub = str.substr(pos);  // "World"부터 끝까지 추출
    cout << sub << endl;  // 출력: World!
}

map 이랑 set 내에 struct 자료형 활용하면서 Index tree같은 테크닉도 필요할 경우 있음

정렬된 상태가 필요없다면 unorded_map → 사용



PSCPPCPP_STL Share Tweet +1