[C++ 표준] string
카테고리: STL
태그: Cpp STL Coding Test
#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이든 둘 다 해당
cin
은 공백, 탭, 엔터를 기준으로 나누어 읽어들인다. 반면에getline
은 오직 엔터\n
을 기준으로 읽어들인다.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”); ❌
- vector같이 쓰는거라서 문자열의 맨 끝에 + 인수로 들어간 문자 1개를 덧붙이는 형태만 붙일 수 있다.
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’가 없다)
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기