C++ Chapter 17.4 : 문자 접근하기와 배열로의 변환
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 17. std::string 문자열 클래스
문자 접근하기와 배열로의 변환
🔔 문자 접근하기
[] 연산자로 접근하기
- std::string 또한 배열처럼 인덱스로 접근이 가능하다.
- my_str[3] = ‘Z’ 바꿔치기도 가능
- “abcdefg” → “abcZefg”
- 다만, “” 빈 문자열일 때
[i]
로 접근하려 하면 런타임 에러가 발생하니 주의할 것!- 아직 없는 공간에 접근하려고 하니 에러가 발생한다.
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string my_str("abcdefg");
cout << my_str[0] << endl; // a
cout << my_str[3] << endl; // d
my_str[3] = 'Z';
cout << my_str << endl; // abcZefg
return 0;
}
at(i)과 [i]의 차이점
str[i]
- 예외를 throw 하지 않아 예외처리를 할 수 없다.
- 따라서
catch
문에도 잡히지 않는다. - 빈 문자열이나 문자열의 길이보다 큰
i
값으로 접근하려고 하면 예외가 발생하는데 이에 대한 처리를 해줄 수 없다는게 단점이다.
- 따라서
- 대신 성능이 좋고 빠르다.
- 예외를 throw 하지 않아 예외처리를 할 수 없다.
str.at(i)
- 예외를 throw 한다. 따라서 예외처리를 할 수 있다.
- 빈 문자열이나 문자열의 길이보다 큰
i
값으로 접근하려고 하면 예외가 발생하는데 이에 대한 처리를 할 수 있다.
- 빈 문자열이나 문자열의 길이보다 큰
- 안정적이긴 하나
[i]
보단 느리다.
- 예외를 throw 한다. 따라서 예외처리를 할 수 있다.
- 이와 같은 차이는
vector
같은 다른 컨테이너에서도 똑같다.
string my_str("abcdefg"); // 길이 7
try
{
//my_str[100] = 'X'; -> 길이가 7 뿐이니 예외 발생. 근데 catch에 안잡힌다. 여전히 런타임 에러 발생
my_str.at(100) = 'X' // -> 예외를 던져주어 catch에 걸릴 것이다.
}
catch (std::exception & e) // 예외 처리
{
cout << e.what() << endl; // 예외 내용 출력
}
🔔 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’가 없다)
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기