Posts 알고리즘 - C++에서 문자열(string) 다루기
Post
Cancel

알고리즘 - C++에서 문자열(string) 다루기


C++에서 문자열(string) 다루기

c++은 문자열을 보다 쉽게 다룰 수 있습니다.

char*, char[] 로 관리하지 말고, 자바나 파이썬같이 문자열 자체를 쉽게 다룰 수 있게 해 줍니다.


string 클래스의 특징

  • 특징 1 : 문자의 끝에 null문자(‘\0’) 등이 포함되지 않는다.
  • 특징 2 : 마치 배열처럼 한 문자씩 다룰 수 있다.
  • 특징 3 : string 클래스 끼리는 문자열을 합치는 것이 + 연산자 하나만으로 가능하다.
  • 특징 4 : 문자열을 사전순으로 정렬할 때도 string 변수를 사용하면 편리하다.
  • 이 외에 다양하게 쓸 수 있는 멤버함수들이 존재합니다.
1
2
3
4
#include <string>

...
string str1 = "TESTString";

string 의 인덱스 접근

  • 배열처럼 접근하기
    • string str = “TEST”; 일 때, str[0] 은 ‘T’를 반환. 이 때 반환되는 문자는 char 형임에 주의!
  • .at(index)로 접근하기
    • string str = “TEST”; 일 때, str.at(1) 은 ‘E’를 반환. 이 때 반환되는 문자는 char 형임에 주의!

문자열의 맨 앞과 맨 끝 문자 반환

  • str.front(); -> 맨 앞 문자 반환
  • str.back(); -> 맨 끝 문자 반환

문자열의 길이 반환

  • str.size(); 혹은 str.length(); 둘 다 사용 가능.

숫자를 문자열(string)로, 문자열을 숫자로 바꾸기

  • 숫자->문자열 전환 : to_string(숫자); 로 사용할 수 있습니다.

  • 1
    2
    3
    
    int a = 7;
    string str1;
    str1 = to_string(a); // 7이 string "7"로 변환되어 str1에 저장된다.
    
  • 문자열->숫자 전환 : int 타입, double 타입 등 숫자의 타입에 따라 아래와 같이 사용합니다. (stoi 함수)

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    
    string str_a ="7";
    string str_b ="7.02";
    string str_c ="3.14";
    string str_d = "2300000000";
    
    int after_a = stoi(str_a); // "7"을 int형 7로 바꿔줌
    double after_b = stod(str_b); // "7.02"를 double형 7.02로 바꿔줌
    float after_c = stof(str_c); // "3.14"를 float형 3.14로 바꿔줌
    long int after_d = stof(str_d); // "2300000000"을 long int형으로 바꿔줌
    

문자열의 capacity

  • string 클래스로 선언된 문자열은, 문자열 길이 말고도 capacity 라는 값이 존재합니다.
  • capacity란 이 객체에 할당된 메모리 bytes 크기로, 객체에 들어올 문자열 크기에 대비하여 좀 더 넉넉하게 알아서 잡혀집니다.
  • str.capacity(); 로 capacity 값을 확인할 수 있습니다.
  • str.reserve(n); 은, 이 문자열 객체에 미리 n bytes 크기를 할당하라는 명령어입니다.
    • 1000 bytes 까지만 허용해야 바람직한 공간이 있다고 가정해 보겠습니다.
    • 글자를 읽어올 때마다 문자열 길이가 증가하여, capacity 값이 넉넉하게 알아서 증가된다면, 일정 수 이상을 읽어오면 capacity 값이 1000 bytes를 초과할 수 있습니다.
    • 즉, 알아서 capacity 값이 넉넉하게 잡혀지는, 특정 상황에서의 비효율적인 행위를 제한하기 위해, 미리 capacity 값을 정해야 하는 상황에서 사용할 수 있습니다.

string 의 유용한 함수들

str.empty();

문자열이 비었나 확인합니다. 이것은 문자열의 size 혹은 length 값이 0인지 아닌지를 보는 것입니다.

swap(str1,str2)

str1, str2 문자열을 서로 swap 합니다. (바꾸기)

str.clear();

str에 들어있던 문자열을 없앱니다. (단, capacity 값은 그대로 유지)

str1.append(str2);

str 문자열 맨 뒤에 str2 문자열을 추가합니다.

1
2
3
4
5
  string str1 = "test";
  string str2 = "yo";
  str1.append(str2); // "testyo" 반환
  str2.append("tete"); // "yotete" 반환
  // 팁 : str1+str2 를 하면 str1에 append(str2)를 한 효과와 동일합니다.

str.find(str2);

str에서 문자열 str2를 찾고, 이것의 str에서의 시작점 인덱스를 반환합니다.

1
2
3
4
  string str1 = "TEST";
  string str2 = "ST";

  str1.find(str2); // 2 반환 (TEST에서 ST의 S는 2번째 인덱스므로)

str.substr();

문자열의 일부분을 반환합니다. -> 반환형이 string임

1
2
3
4
5
6
  string str = "TESTtest";

  str.substr(3); // 3번째 인덱스인 T부터 끝까지 반환 -> Ttest 반환

  str.substr(3, 2); // 3번째 인덱스인 T부터 2 길이만큼의 문자열 반환
  // 즉, Tt 가 반환됩니다.

replace 멤버함수는 용도에 따라 다양하게 오버로딩 되어 있습니다.

  • str.replace(idx,len,str2); : 문자열의 특정 인덱스부터 일정 길이만큼 str2로 변경*

    • 1
      2
      3
      4
      
      string str1 = "TEST";
      string str2 = "your";
      str1.replace(1, 2, str2); // str1의 1번째 인덱스인 E부터 2개의 길이만큼의 문자열이 str2로 변경
      // 즉, TyourT 로 변경
      
  • str.replace(str.begin()+1, str.begin()+3, str2); : [예] str의 1번째 인덱스부터 3번째 인덱스 직전까지의 문자열을 str2로 변경

    • 1
      2
      3
      
      string str1 = "TESTT";
      str1.replace(str.begin()+1, str.begin()+4, "aa");
      // EST를 aa로 변경하여, TaaT 가 반환됨
      

문자열의 사전 순서 비교 - 부등호로 비교 가능(<,>,==)

1
2
3
4
5
  string str1 = "aaad";
  string str2 = "aaaf";

  cout << (str1 < str2); // 1(참)이 반환됩니다.
  // 즉, str1과 str2 중 사전 순으로 str1이 더 앞선 글자므로, str2보다 작습니다.

따라서 아래와 같은 것도 가능합니다. + 연산자로 두 문자열을 쉽게 합칠 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
  string str1 = "10";
  string str2 = "6";

  cout << (str1 < str2); // 1이 반환됩니다.
  // 즉, 사전순으로는 10이 6보다 앞서 있기 때문입니다.

  string str3 = str1 + str2; // "106"
  string str4 = str2 + str1; // "610"

  cout << (str3 < str4); // "610"이 사전 순서상 더 뒤이므로 크고, 1이 반환됩니다.
  // 이를 응용하면, 같은 자릿수로 받아진 정수 형태(ex: "1234")의 문자열 비교는
  // 단순히 int형끼리 비교하는 것과 같습니다.

C에서 까다로운 것 중 하나가 문자열 다루기인데,

C++에서 이렇게 문자열에 관한 편리한 클래스와 함수를 제공하는 것을 일찍 알지 못해 불편을 겪고 있었습니다.

파이썬과 비슷하게 처리할 수 있게 해 주어 알아두면 매우 간편할 것 같습니다.

[백준] 1699번 - 제곱수의 합

[백준] 15954번 - 인형들