C++ Chapter 17.4 : 문자 접근하기와 배열로의 변환

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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값으로 접근하려고 하면 예외가 발생하는데 이에 대한 처리를 해줄 수 없다는게 단점이다.
    • 대신 성능이 좋고 빠르다.
  • str.at(i)
    • 예외를 throw 한다. 따라서 예외처리를 할 수 있다.
      • 빈 문자열이나 문자열의 길이보다 큰 i값으로 접근하려고 하면 예외가 발생하는데 이에 대한 처리를 할 수 있다.
    • 안정적이긴 하나 [i]보단 느리다.
  • 이와 같은 차이는 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’가 없다)


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

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기