이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;)
이번 포스팅에서는 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 문자를 저장해야합니다.
'Information Technology > C++' 카테고리의 다른 글
[C++] 동적 형변환 Dynamic_casting (0) | 2019.12.11 |
---|---|
[C++] 객체잘림과 reference_wrapper (0) | 2019.12.11 |
[C++] std::string의 길이와 용량 (0) | 2019.12.08 |
[C++] std::string의 여러가지 생성자들과 형변환 (0) | 2019.12.07 |
[C++] std::string과 std::wstring (0) | 2019.12.07 |