본문 바로가기

Information Technology/C++

[C++] std::string에서 문자 접근하기와 배열로의 변환

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;)


이번 포스팅에서는 string 자료형의 문자열에서 각각의 문자에 접근하는 방법과,

string 자료형의 문자열을 C 스타일의 배열로 변환하는 방법을 알아보겠습니다.


#include <iostream>
#include <string>
#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;
}

우선 string 자료형의 문자열에서 각각의 문자에 접근하는 방법은 일반 배열, 또는 벡터와 유사합니다.

인덱스를 사용해서 해당 인덱스의 문자열을 호출할 수 있고, 변경 역시 가능합니다.

int main()
{
	string my_str("abcdefg");

	try
	{
		//my_str[100] = 'X';	// 속도가 너무 느려져서 예외처리도 작동 x
		my_str.at(100) = 'X';
	}
	catch (std::exception &e)
	{
		cout << e.what() << endl;	// 어떤 에러가 발생했는지 알려주는 what()
	}

	return 0;
}

이번에는 정의한 string 문자열의 크기를 벗어나는 범위의 인덱스에 문자열을 할당해보았습니다. 어떤 에러가 발생하는지 확인하기 위해 try-catch를 통해 예외처리 구문을 사용했습니다.

프로그램을 실행시키면 위와 같은 결과가 출력됩니다. 메시지 그대로 옳지 않은 string의 위치라는 에러입니다.


int main()
{
	string my_str("abcdefg");
	const char* arr = my_str.c_str(); // string 자료형 my_str의 주소가 C 스타일로 변경

	cout << arr << endl; 	     // 'abcedfg' 출력
	cout << (int)arr[7] << endl; // 0(null 문자) 출력

	return 0;
}

이번에는 string 자료형 문자열을 C 스타일의 문자열 출력, 즉 char의 포인터를 통해 배열로 저장하는 방법을 알아보겠습니다.

방법은 간단합니다. 위의 코드 블록처럼 string 자료형 인스턴스에 c_str()을 사용하면 됩니다.

char 자료형의 포인터 변수 arr에 my_str.c_str()을 저장하고 arr을 출력하면 my_str과 같이 'abcdefg'가 출력되는 걸 볼 수 있습니다.

중요한 점은, c_str()로 변환된 string 문자열은 C 스타일의 문자열 저장 배열이 그러하듯 마지막 멤버로 null 문자를 가지고 있습니다. 이를 확인하기 위해 arr의 7번째 멤버를 int로 형변환하여 출력하면 null문자의 아스키 코드 값인 0이 출력되는 걸 볼 수 있습니다.


int main()
{
	string my_str("abcdefg");
	char buf[20];

	my_str.copy(buf, 5, 0);
	buf[5] = 0;
	cout << buf << endl;
	
	return 0;
}

char 자료형의 배열을 만들고, string의 copy()기능을 통해 문자열을 전달하는 방법도 있습니다.

copy()의 사용법은 위의 코드 블록과 같이, 첫 번째 매개변수에는 배열 이름을, 두 번째 배열에는 복사할 문자열의 개수를, 마지막 매개변수에는 offset, 즉 몇 번째 문자부터 복사를 시작할지 입력하면 됩니다.

주의할 점은, copy는 단순 문자열을 복사해줄 뿐 c_str()처럼 null 문자를 배열의 마지막에 자동으로 저장하지 않기 때문에 위의 코드 블록처럼 직접 문자열의 끝에 null 문자를 저장해야합니다.