Unreal TIL 20일차 - C++ 문자열 처리 함수

yys·2026년 3월 24일

TIL

목록 보기
16/86

🔗 학습 날짜 인증(주제와 무관)

오늘 한 내용

  • C++ 코드카타
  • UE5 C++ 인벤토리 시스템(개인 공부)

매일 코드카타를 진행하면서 문자열 처리 관련 알고리즘 문제들을 풀게되면 꼭 문자열 처리 함수들을 검색하는 나를 보게된다.

계속 함수 검색을 해가면서 하는 것도 옳지 않은 방법이기 때문에 오늘 한 번 제대로 정리해보려고 한다.

오늘 풀었던 문제는 아래와 같은데 문제 해결 능력도 문제이긴 하지만, 슬라이싱/형 변환 등을 할 수 있는지가 주요 평가 요소 였다.
https://school.programmers.co.kr/learn/courses/30/lessons/150370

문자열 슬라이싱


문자열 슬라이싱을 제공해주는 함수로 substr()이 있다.
(size_t가 자주 명시되어 있는데, unsigned long long의 별명이다.)

// pos: 시작 인덱스
// count: 뽑을 개수
string substr(size_t pos = 0, size_t count = npos) const;

예시

#include <string>

using namespace std;

int main()
{
	string date = "2026.03.24";
	string year = date.substr(0, 4); // "2026"
	string month = date.substr(5, 2); // "03"
    
    // 뽑을 개수를 생략하면 시작 인덱스부터 문자열 끝까지 반환한다.
    string day = date.substr(8); // "24"
}

단, Python처럼 특정 문자를 기준으로 슬라이싱하는 함수는 존재하지 않는다.

형 변환


string->int로는 stoi() 함수를 사용하면 된다.
(double은 stod(), long long은 stoll(), 반환형을 제외한 동작 방식은 동일)

// str: 변환할 문자열
// pos: 읽기를 멈춘 위치(인덱스) 값(예시 참고)
// base: 진법
int stoi(const string& str, size_t* pos = nullptr, int base = 10);

예시

#include <string>

using namespace std;

int main()
{
	int num = stoi("123"); // 123
    
    // stoi()는 도중에 문자를 정수로 변환하지 못하면
    // 했던 부분까지의 결과를 반환하고 함수를 종료한다.
    // 멈춘 위치를 알고 싶다면 위치를 담을 변수의 주소를 넘겨주면 된다.
    int pos;
    string s = "123p";
    
    num = stoi(s, &pos) // 123, pos = 3(인덱스 3에서 멈췄으므로)
    
    // 만약, 처음부터 숫자로 변환하지 못하는 문자가 있으면 에러가 발생한다.
    num = stoi("p123"); // error!
}

int->string으로는 to_string() 함수를 사용하면 된다.
(double처럼 int 이외의 타입도 가능)

string to_string(int val);

예시

#include <string>

using namespace std;

int main()
{
	string s = to_string(324); // "324"
}

지금은 잘 사용하지 않지만, C++11 이전에는 atoi()/c_str()을 이용한 형 변환을 사용했다.

int atoi(const char* str) -> const char* 타입을 숫자로 형 변환

const char* c_str(string str) -> string 타입을 const char* 타입으로 형 변환

예시

#include <cstdlib> // atoi()
#include <string> // c_str()

using namespace std;

int main()
{
	int num = atoi("123"); // 123
    
    // atoi()도 도중에 문자를 정수로 변환하지 못하면
    // 했던 부분까지의 결과를 반환하고 함수를 종료한다.
    // 단, 멈춘 위치를 저장하는 기능은 없다.
    string s = "123p";
    
    num = atoi(s.c_str()) // 123
    
    // 또한, stoi()와 달리 처음부터 숫자로 변환하지 못하는 문자가 있으면 0을 반환한다.
    num = stoi("p123"); // 0
}

특정 문자열 탐색


앞에서부터 검색해서 특정 문자열을 탐색하려면 find() 함수를 사용하면 된다.

// str: 탐색할 문자열
// pos: 탐색 시작 위치
// 탐색에 성공하면 특정 문자열의 시작 위치(인덱스)를 반환
size_t find(const string& str, size_t pos = 0) const;

예시

#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s = "Unreal C++ Programming";
	int pos = s.find("C++"); // 7 반환
	
    // 만약 찾으려는 문자열이 없으면 string::npos라는 쓰레기 값을 반환한다.
    if (s.find("Python") == string::npos)
    {
    	cout << "찾는 문자열 없음" << endl;
    }
}

아직까지는 알고리즘 문제를 풀어보았을 때, 문자열 처리 함수는 언급한 내용 이외에는 자주 사용하지 않거나 바로 해결할 수 있는 문제라서 이 정도만 정리를 하고 나중에 포스팅 하는 것이 좋을 것 같다.

profile
게임 개발 지망생

0개의 댓글