Programming Language/C++

Ch06. 복합데이터 - 04. String

hustle_D 2025. 4. 2. 21:27
반응형

1. std::string

std::string은 C++ 표준 라이브러리에서 제공하는 문자열 클래스로 C 스타일 문자열(char[], char*)의 단점을 보완한 객체 지향적 문자열 타입이다

메모리 자동 관리, 연산자 오버로딩, 편리한 문자열 조작 함수들이 내장되어 있다.

 

std의 string을 사용하기 위해서는 가장 먼저 헤더를 선언해줘야 한다.

#include <string>

 

*보통 #include <iostream>에도 포함되어 있음

2. 사용방법

기본적으로 std::string의 사용방법은 

std::string 변수명 = 문자열;

과 같은 방법으로 사용 가능하며 실 사용 예시를 보자면 

std::string s1 = "String";

과 같이 사용한다.

 

3. 주요 기능 및 메서드

std::string은 기존에 char[] 의 형태로 구성되어 있던 문자열과 다르게 간편하게 사용할 수 있는 기능들을 가지고 있다.

 

3-1) 문자열의 길이 확인

std::string에서의 문자열의 길이 확인은 str.length(), str.size() 함수를 사용한다

 

#str.length()

문자열.length();

와 같이 사용하며

이렇게 사용할 수 있다.

 

#str.size()

문자열.size();

와 같이 사용하며

length와 동일한 결과를 출력한다.

 

3-2) 문자의 접근

std::string의 경우 각 요소에 접근하는 방식이 두가지가 있다.

 

# str[i]

해당 방식은 기존에도 사용하던 방식으로 

문자열[접근하고자하는 요소의 index];

와 같이 사용한다.

 

# str.at(i)

이건 기존이랑 접근방식이 조금 다른 방법으로 

문자열.at(접근하고자하는 요소의 index);

와 같이 사용한다.

 

3-3) 문자열 붙이기

기존엔 char[]으로 구성된 문자열의 경우는 strcat함수를 사용해서 

strcat(기존 문자열(해당 문자열에 추가된 문자열이 붙어 저장됨), 추가될 문자열);

와 같이 사용되었었으나 std::string의 경우에는 그냥 + 연산자를 사용해서 붙여줄 수 있다.

 

아래와 같이 선언만 해두고 

추가로 값을 더해주는 것으로 할당 하는것도 가능하다

 

추가로 그냥 문자를 + 연산해서 넣어주는 것도 가능하다.

 

3-4) 문자열 비교하기

문자열의 비교 또한 기존에는 strcmp 함수를 사용해서 

std::strcmp(str0, str1)

로 비교했던 방식을 std::string에 들어오면서 

이렇게 그냥 단순 비교하듯이 사용해도 

비교가 가능하다.

3-5) 문자열의 일부분 추출하기

string의 경우는 문자열의 일부를 함수 하나로 범위를 지정해서 추출이 가능하다.

str.substr(시작점, 길이);

로 어디 시작점부터 얼마만큼의 길이만큼 추출을 해주는 함수이다.

이렇게 작성하고 실행해보면

이렇게 잘 추출하는 것을 볼 수 있다.

 

함수를 사용할때 주의할 점은 시작점을 포함해서 추출해준다는 것이다.

StringMasterHello에서 M은 6번째 인덱스이고 이를 포함해서 6개만큼의 문자를 출력해준 결과가 Master이다.

 

3-6) 문자열 찾기

문자열의 내부에서 찾고자 하는 문자열의 시작지점을 알려주는 함수가 존재한다.

str.find(찾고자하는 문자열);

 

이 결과는 찾고자 하는 문자열이 str에 어디에 위치하고 있는지 index를 반환한다.

 

이 함수와 기존에 길이 찾는 함수 + 부분 추출하는 함수를 사용하면 문자열 내부에서 해당 함수를 외부로 추출도 가능하게 할 수 있다.

별 의미는 없지만 활용할 간단한 예시라고 봐주면 될듯 하다.

 

3-7) 문자열의 삽입

문자열의 안에 원하는 문자열을 삽입할 수 있도록 해주는 insert()라는 함수가 존재한다.

사용 방법은 아래와 같고

str.insert(위치, 문자열) // 원하는 위치에 문자열을 삽입한다
str.insert(위치, 반복 횟수, 문자) // 원하는 위치에 문자를(char, 단일 문자) 원하는 횟수만큼 삽입한다

실 사용의 예를 보자면

 

두번째 인자로 반복횟수가 추가된다면 세번째 인자로는 단일 문자가 전달되어야만 한다.

 

 

3-8) 문자열의 삭제

문자열 내부에 특정 범위만큼의 문자열을 삭제하는 것도 가능하다.

str.erase(삭제시작지점);                          // 시작지점부터 끝까지 삭제
str.erase(삭제시작지점, 삭제하고자 하는 길이);    // 삭제 시작 지점부터 n개 문자 삭제
str.erase(iterator);                             // iterator로 지정된 문자 삭제
str.erase(begin, end);                           // 구간 삭제

 

각각 예시를 보자면 

 

# str.erase(삭제 시작 지점)

 

지정한 삭제 시작 지점부터 끝까지 모두 제거한다

 

# str.erase(삭제시작지점, 삭제하고자 하는 길이)

지정한 위치부터 지정한 길이만큼을 지운다.

 

# str.erase(iterator), str.erase(begin, end) - 조금 복잡한듯 싶어 이 부분은 나중에 보기로 하자.

 

3-9) 문자열의 변환

atoi, atof 혹은 sprintf와 같이 문자을 정수 혹은 실수로, 정수 혹은 실수를 문자로 바꾸는 방법을 더 간단하게 사용이 가능하다

// String을 정수로
std::stoi(std::string 변수 혹은 문자열);

// String을 실수로
std::stof(std::string 변수 혹은 문자열);

// 정수, 실수를 String으로
std::to_string(int 변수 혹은 숫자);
std::to_string(float 변수 혹은 숫자);

 

#String을 정수로: std::stoi()

혹은 직접 문자열을 넣는것으로도 변경이 가능하다.

 

#String을 실수로: std::stoi()

문제없이 반환하여 할당되는 것을 확인할 수 있다.

 

# 정수, 실수를 String으로 : std::to_string()

 

float형으로 넣어도 문제 없이 변환한다.

 

위와 동일하게 그냥 직접 숫자를 넣어줘도 변환이 가능하다

 

3-10) char[]형을 string으로, string을 char[]로 변환

#char[]형을 string으로 변환

std::string(str);

 

#string을 char[]형으로 변환

str.c_str()

을 사용하는데 저걸 사용하면 우선 char형 포인터가 만들어진다 

이걸 strcpy를 사용해서 

std::string s1 = "String";
char str1 [10];
std::strcpy(str1, s1.c_str());

과 같이 사용하면 string 타입에서 char[] 타입으로 변경이 가능하다.

 

 

3-11) string을 입력받기 

기존엔 std::cin.getline()을 사용할때 첫번째 전달인자로 저장할 장소, char []을 넣어주고 두번째로는 얼마만큼의 크기를 입력받을지를 설정했었는데 string의 경우는 다른 함수이며 다른 방식을 사용한다.

std::getline(cin, string 변수);

 

정상적으로 받는 것을 볼 수 있다.

 

다수의 입력을 받을때도 

이렇게 공백문자가 있더라도 우리가 바라는 입력 방식으로 모든 값을 받아줄 수 있다.

 

반응형