[C++ 표준] string

Date:     Updated:

카테고리:

태그:

#include <string>

  • C++의 문자열 라이브러리
  • npos : 상수로 string.h 헤더 파일내에 -1 로 정의되어 있다. 해당 문자 혹은 문자열이 없다는 의미로 받아 들이면 될 것 같다!

🔔 함수

substr

  • substr(int pos, int count)
    • 원래 문자열에서 [pos, pos + count] 범위의 부분 문자열을 리턴한다.

    • pos : 첫번째 문자의 위치
    • count : 부분 문자열의 길이.
      • 디폴트 값은 npos라서 길이를 지정해주지 않으면 자동으로 pos부터 문자열의 끝까지 리턴한다.
        a.substr(10);  // a 문자열의 인덱스10 ~ 끝까지
        a.substr(5, 3); // a 문자열의 인덱스 5 ~ 인덱스 8 (=5+3) 리턴
        


find

n = s.find("is");  // s의 문자열 중 부분적으로 "is"를 포함하는지 찾고 찾았다면 그 문자열의 시작 위치를 리턴한다.
n = s.find("is", 5); // s의 문자열 중 부분적으로 "is"를 포함하는지를 5번째 인덱스부터 찾는다. 찾았다면 그 문자열의 시작 위치를 리턴한다.

인수로 들어간 문자열 혹은 문자가 포함되어 있는지를 찾는다. 찾았다면 그 문자열의 시작 위치, 문자라면 그 문자의 위치를 리턴하고 찾지 못했다면 npos를 리턴한다.

if(s.find("is", 5) != string::npos)


stoi, stol, stoll

string str1 = "123 안녕";
int a = stoi(str1);  // 정수 123 까지만 들어감.

string str2 = "0012";
int b = stoi(str2);  // 문자열 0012 를 정수로 변환하면 12

문자열을 정수로 변환한다.

  • 변환이 가능한 부분까지만 변환한다.
  • 이 밖에도 반대로 정수에서 문자열로 변환하는 atoi도 있고 stof도 있고 부호 없는 정수로 변환하는 stoul도 있음!


to_string

int a = 123;
string str = to_string(a);  // "123"

정수나 실수를 문자열로 바꾼다.


getline

string 의 getline 👉 공백 포함하여 한 줄을 전부 읽어들인다.

istream & getline (istream & is, string & str, char delim);  // delim 디폴트 값은 '\n'
  • 입력 스트림이 첫번재 인자로 오고 두번째 인자로는 string 객체를 받는다.
  • string형식의 C++ 언어 스타일 문자열에 입력하는 방식이다.
  • cin.getline과 달리
    • 인수로 char * 포인터 형식을 넣어줘선 안된다!
    • 읽어들일 문자의 개수를 지정하는건 없다.
// 콘솔 입력 
string str;
getline(cin, str);

// 파일 입력 
string str;
ifstream ifs;
ifs.open("input.txt");
getline(ifs, str);

std::cin 과의 차이

getline은 string이든 cin이든 둘 다 해당

  1. cin은 공백, 탭, 엔터를 기준으로 나누어 읽어들인다. 반면에 getline은 오직 엔터 \n을 기준으로 읽어들인다.
  2. cin은 공백, 탭, 엔터를 버퍼에 남긴다. 반면에 getline은 엔터까지 읽어들이면서 엔터를 버퍼에 남기지 않는다. 버퍼에 남기지 않고 그냥 버린다!


front, back

string s = "Hello, World!";
cout << s.front() << endl;  // 맨 앞글자인 'H' 출력
cout << s.back() << endl;  // 맨 뒷글자인 '!' 출력


+ 연산자

string a = "Hello";
string b = "World!";
string c = a + ", " + b; // "Hello, World!"
  • 문자열끼리 + 연산을 통하여 이어 붙일 수 있다.
  • string 헤더에 +가 오버로딩 되어 있기 때문!


append

append(추가할 문자열, 추가할 문자열의 시작 지점, 몇 글자 추가할건지)

  • 호출하는 문자열의 뒤에 인수로 들어온 문자열을 붙인다.
  • 문자열을 + 연산자를 사용해 붙이는 것보다 append 함수를 사용하는게 더 빠르다.✨
string a = "";
a.append("Hello");
cout << a << endl; // "Hello" 출력
string a = "Hello";
string b = "World";
string c = "";

a.append(b, 0, 3);  // "HelloWor"가 된다. 문자열 b 의 0 인덱스로부터 3 개 ("Wor")를 a 뒤에 붙이기 
c.append(b, 2);  // "HelloWo"가 된다. 문자열 b의 처음부터 2 개 ("Wo")를 a 뒤에 붙이기

append(num, char c)

  • char c 문자를 num 개수만큼 반복해서 뒤에 붙여라
string a = "Hello";
a.append(3, '*'); // "Hello***" 가 된다.


push_back

  • append와 같이 뒤에 덧붙인다. 단 문자 1개만.
  • str.push_back(char)
    • vector같이 쓰는거라서 문자열의 맨 끝에 + 인수로 들어간 문자 1개를 덧붙이는 형태만 붙일 수 있다.
      • str1.push_back(‘A’); ⭕
      • str1.push_back(“AB”); ❌


insert

호출한 문자열의 인수로 넘기는 인덱스에, 인수로 넘기는 문자 혹은 문자열을 삽입

  • insert 함수 오버로딩들
basic_string& insert(size_type index, size_type count, CharT ch);  // ch를 count만큼 반복하여 이를 호출한 문자열의 index 인덱스에 삽입
basic_string& insert(size_type index, const CharT* s);  // s 문자열을 호출한 문자열의 index 인덱스에 삽입
basic_string& insert(size_type index, const CharT* s, size_type count);  // s 문자열의 count 문자 개수만큼 호출한 문자열의 index 인덱스에 삽입
basic_string& insert(size_type index, const basic_string& str);  
basic_string& insert(size_type index, const basic_string& str, size_type index_str, size_type count = npos);  // s 문자열의 index_str count 문자 개수만큼 호출한 문자열의 index 인덱스에 삽입인덱스로부터 
  • 인덱스(int)가 아닌 반복자를 인수로 넣을 수도 있다!


swap

  • str1.swap(str2)
    • 서로 string 문자열 값을 교환
    • std::stirng에도 내장되어 있는 교환 함수다.


max_size

최대한으로 메모리를 할당했을 경우 저장할 수 있는 문자열의 길이


C언어 스타일 문자열(배열)로 바꾸기

c_str() 함수 사용하기

  • c_str() 👉🏻 C 스타일 문자열 버전으로 리턴한다.
    • 문자열 끝에 \0가 붙어있는 char배열
      • 따라서 size = length + 1
{
	string my_str("abcdefg"); 

	cout << my_str.c_str() << endl;

	const char *arr = my_str.c_str()

	cout << arr[6] << endl;  // g
	cout << arr[7] << endl;  // '\0'
}

data() 함수 사용하기

  • c_str() 함수와 하는 일 똑같다. 👉🏻 C 스타일 문자열 버전으로 리턴한다.

copy() 함수 사용하기

str.copy(buf, int a, int b) 👉🏻 str문자열의 b인덱스부터 시작하여 a개의 문자를 buf 문자열(char [])에 복사하고 복사된 길이를 리턴한다.

string my_str("abcdefg");

char buf[20];

my_str.copy(buf, 5, 1);

buf[5] ='\0'

cout << buf << endl;
  • char buf[20];
    • 복사할 빈 C스타일의 char [] 문자열을 만든다.
  • my_str.copy(buf, 5, 1);
    • buf 빈 문자열 배열에 my_str string 문자열 중 5글자를 복사. 1번째 인덱스부터 복사 시작.
    • “bcdefg”가 buf에 복사 된다.
    • 두번째 매개변수 : 문자열의 길이
    • 세번째 매개변수 : 복사를 시작할 위치
    • 실제로 복사된 길이를 반환. (buf의 길이)
  • buf[5] = '\0'
    • ‘\0’은 복사해주지 않으므로 직접 마지막에 붙여준다. (std::string은 ‘\0’가 없다)


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기