TIL_019: string 관련 함수, distance, Unreal C++

김펭귄·2025년 8월 22일

Today What I Learned (TIL)

목록 보기
19/139

오늘 학습 키워드

  • string 관련 함수

  • distance 함수

  • Unreal C++

1. string 관련 함수

문자열 자르기

str.substr(pos, count)

  • 문자열의 일부분을 잘라 반환
string s{"abcde"};
cout << s.substr(1, 2);		// 인덱스 1번부터 2개만 자르기 ("bc")
cout << s.substr(3)			// 인덱스 3번부터 끝까지 자르기 ("de")

strtok(str, token)

  • token을 기준으로 문자열을 잘라 반환
#include <cstring> // strtok, strcpy 등 C 문자열 함수 포함

int main() {
    char str[] = "MY NAME IS TOM"; // C스타일 문자열만 가능
    
    // 첫 호출 시 원본 문자열과 구분자 전달
    char* token = strtok(str, " ");
    
    // strtok이 NULL을 반환할 때까지 반복
    while (token != NULL) {
        std::cout << token << std::endl; // 잘린 토큰 출력
        token = strtok(NULL, " "); // 다음 호출부턴 NULL을 인자로
    }
}

to_string()의 한계

cout << to_string('c');		// 99가 출력
  • to_string()함수는 정수 또는 실수 타입을 문자열로 변환하도록 설계되어 있어, 'c'에 해당하는 아스키코드 99가 문자열로 변환됨

해결법

char ch = 'c';
string s1(1, ch);		// 생성자로 생성
string s2{}, s3{};
s2.push_back(ch);		// 다른 컨테이너처럼 사용 가능
s3.assign(1, ch);		// assign으로 값 할당

string iterator

  • 문자열 역시 다른 컨테이너처럼 반복자를 사용할 수 있다

  • begin(), end()로 접근 및 수정도 가능

  • push_back() 사용하여 문자열 끝에 문자를 추가

  • insert, erase 등 여러 함수 지원

string str = "hello";
for (auto it = str.begin(); it != str.end(); ++it) {
    std::cout << *it << " "; 	// h e l l o
}
str.push_back('!');
std::cout << str; 				// hello!

assign()

  • 문자열 객체의 값을 한 번에 새로 할당(재설정)할 수 있게 해주는 멤버 함수
string str;
str.assign("ABCDEFG"); 			// "ABCDEFG"
str.assign(3, 'x'); 			// "xxx"
str.assign("ABCDEFG", 2, 4); 	// "CDEF" (2번 인덱스부터 4글자)
  • string()생성자는 새로운 string 객체를 생성할 때 사용

  • assign()은 이미 존재하는 string 객체에 대해 내용을 바꾸는 것 (문자열 교체)

문자열 추가

  • push_back은 하나의 문자를 추가, 아래의 방법들은 문자열을 추가

  • string(3, '!')처럼 한번에 하나의 문자를 여러 개 추가할 수 있던것과 달리 문자열은 안 되므로 추가하는 작업을 여러 번 해야함

+

  • 문자열끼리 붙여 임시객체를 생성
string s{"abc"};
s = s + "de";		// (s += "de")과 동일
return s + "fgh";
  • 적은 연산이면 문제 없지만, 연산이 많아지면 계속 임시객체 생성하기에 비효율적

append()

  • 문자열 끝에 문자열을 추가해주는 함수

  • ++=보다 좀 더 최적화됨

string s = "Hello";
s.append(" World");
s.append(3, '!');  // !를 3개 추가 -> Hello World!!!
s.append(s, 0, 5); // 자신의 앞 5글자 추가 -> Hello World!!!Hello

insert()

  • 특정 위치에 문자나 문자열 삽입
string s = "Hello";
s.insert(5, " World"); // s = "Hello World"
s.insert(0, 3, '*');   // s = "***Hello World"

문자열 제거

erase()

  • 특정 위치부터 일정 길이만큼 제거
string s = "Hello World";
s.erase(5, 6);  // "Hello" (5번 인덱스부터 6글자 삭제)

pop_back()

  • 마지막 문자 제거
s = "Hello!";
s.pop_back();  // "Hello"

clear()

  • 문자열 전체 제거
std::string s = "Hello";
s.clear();  // ""

replace()

  • 특정 위치의 부분 문자열을 교체하거나 제거 가능
  • 빈 문자열로 교체하면 제거 효과
string s = "Hello World";
s.replace(5, 6, ""); // "Hello"

find()

  • str.find(key): 문자열 str에서 key를 찾아 인덱스를 반환. 못 찾으면 string::npos를 반환

  • str.find(key, pos): 문자열 str에서 pos위치부터 key를 찾아 인덱스를 반환. 못 찾으면 string::npos를 반환

distance(a, b)

  • a에서 b까지의 거리

  • 순방향 반복자와, 역방향 반복자일 때 거리 계산하는 법이 다름

using namespace ste;
int main() {
    vector<int> v = {10, 20, 30, 40, 50};

    auto rit1 = v.rbegin() + 1; // 역순 두 번째 원소 (40)
    auto rit2 = v.rbegin() + 3; // 역순 네 번째 원소 (20)

    // 역방향반복자의 경우 역방향쪽으로 거리계산
    cout << distance(rit1, rit2) << endl; // 2
    cout << distance(rit2, rit1) << endl; // -2

    auto it1 = v.begin() + 1;			// 20
    auto it2 = v.begin() + 3;			// 40
    cout << distance(it1, it2) << endl;	// 2
    cout << distance(it2, it1) << endl;	// -2
}

3. Unreal C++

C++ 프로젝트 문제 해결

  • 이전 TIL의 이후 프로젝트를 생성하는 과정에서 문제들이 발생하였음
  1. 새 언리얼 프로젝트의 폴더 경로에는 한글이 있으면 안 됨
  2. visual studio가 너무 최신 버젼이면 호환이 안 되어서 에러창에 뜨는 버젼으로 installer에서 설치해야 함
  3. 아래 사진에 보이는 블럭 모양을 클릭해줘야, 내가 작성한 C++ 코드가 컴파일이 됨

3, 6, 9 게임

  • 액터의 beginPlay()에 아래의 코드를 작성해주어 간단한 문법을 익혀보았다
int Start = 1; // 출력할 숫자의 시작 값
int End = 30;  // 출력할 숫자의 끝 값

for (int i = Start; i <= End; ++i)
{
    // 숫자를 문자열(FString)로 변환
    FString Number = FString::FromInt(i);
    bool bIsClap = false; // "짝"을 출력할지 여부를 나타내는 플래그

    // 변환된 문자열을 한 글자씩 검사
    for (TCHAR Char : Number) // TCHAR를 사용해 플랫폼 독립적 문자 처리
    {
        // 현재 글자가 '3', '6', '9' 중 하나인지 확인
        if (Char == '3' || Char == '6' || Char == '9')
        {
            bIsClap = true; // "짝"을 출력해야 함
            break; 
        }
    }

    if (bIsClap)
    {
        UE_LOG(LogTemp, Warning, TEXT("clap!"));
    }
    else
    {
        UE_LOG(LogTemp, Warning, TEXT("%d"), i);
    }
}

랜덤 숫자 출력

  • 랜덤 숫자를 출력해봄으로써 형식지정자와 random 문법에 대해 알아봄
   // 랜덤 숫자 범위 설정
    int MinValue = 1;
    int MaxValue = 100;

    // 랜덤 숫자 3개 생성
    int RandomNumber1 = FMath::RandRange(MinValue, MaxValue);
    int RandomNumber2 = FMath::RandRange(MinValue, MaxValue);

    // 합계 계산
    int Sum = RandomNumber1 + RandomNumber2;

    // 결과 출력
    UE_LOG(LogTemp, Warning, TEXT("Numbers: %d, %d), RandomNumber1, RandomNumber2);
    UE_LOG(LogTemp, Warning, TEXT("Sum of Numbers: %d"), Sum);

UE_LOG

  • UE_LOG는 크게 3가지 부분으로 이루어짐 (카테고리, 심각도, 내용)

카테고리

  • 로그에 태그를 붙여 필터링 할 수 있게 함

  • 보통 LogTemp를 많이 사용

심각도

  • 중요도에 따라 로그의 색 다르게 출력

  • linux kernel의 KERN_DEBUG같이 flag라 보면 됨

로그 내용

  • 아래는 다양한 로그 예시들
  • beginPlay()함수 내에서 TextUELogExamples()를 호출해주면 됨
void TestUELogExamples()
{
    // 1. 일반 로그(Log) - 개발자가 디버깅을 위해 사용하는 기본 메시지
    UE_LOG(LogTemp, Log, TEXT("Game has started. Player has joined the game."));

    // 2. 중요 정보(Display) - 항상 표시되는 정보 메시지
    FString PlayerName = TEXT("Player1");
    UE_LOG(LogTemp, Display, TEXT("Welcome, %s!"), *PlayerName);

    // 3. 경고(Warning) - 잠재적 문제가 있을 때 경고를 출력
    int PlayerHealth = 50;
    if (PlayerHealth < 100)
    {
        UE_LOG(LogTemp, Warning, TEXT("Low HP: %d"), PlayerHealth);
    }

    // 4. 오류(Error) - 실행에 영향을 줄 수 있는 문제
    int AmmoCount = 0;
    if (AmmoCount == 0)
    {
        UE_LOG(LogTemp, Error, TEXT("No ammo! "));
    }

    // 5. 문자열 결합 - 다양한 데이터를 한 메시지로 출력
    int Score = 150;
    int TimeLeft = 120;
    UE_LOG(LogTemp, Log, TEXT("Score: %d, Time Left: %d seconds."), Score, TimeLeft);

    // 6. 부동소수점(Floating Point) 값 출력
    float PlayerSpeed = 325.5f;
    UE_LOG(LogTemp, Display, TEXT("Player speed: %.2f units/sec"), PlayerSpeed);

    // 7. 여러 심각도 사용 - 게임 상태에 따라 로그를 구분
    bool bIsPaused = true;
    if (bIsPaused)
    {
        UE_LOG(LogTemp, Warning, TEXT("Game is paused."));
    }
    else
    {
        UE_LOG(LogTemp, Log, TEXT("Game is running."));
    }
}
profile
반갑습니다

0개의 댓글