본문 바로가기
Program Language/c++

C++ 기초(Raw String Literal)

by 토담이아빠 2023. 2. 20.

raw string literal

 

이번 포스팅에서는 조금은 생소하지만 스트링을 사용함에 있어서 편리함을 제공해 주는 로 스트링 리터럴에 대해서 정리했습니다. 


인용구 사용

 

문자열 안에 인용구 같은 또 다른 문자열을 넣고 싶어서 다음과 같이 작성한다면 바로 컴파일 에러가 발생할 것입니다.


const char* str = "나폴레옹은 "1퍼센트의 가능성, 그것이 나의 길이다!"라는 명언을 남겼습니다.";

보통 위의 경우 이스케이프 시퀀스 \" 을 사용하여 다음과 같이 표현합니다.


const char* str = "나폴레옹은 \"1퍼센트의 가능성, 그것이 나의 길이다!\"라는 명언을 남겼습니다.";

하지만 이스케이프 시퀀스를 사용하지 않고 다음과 같이 표현되는 로 스트링 리터럴을 사용하면 가독성을 높일 수 있습니다. 로 스트링 리터럴은 R"(문자열)"로 표현합니다.


const char* str = R"(나폴레옹은 "1퍼센트의 가능성, 그것이 나의 길이다!"라는 명언을 남겼습니다.)";

 

줄 바꿈

 

로 스트링 리터럴을 사용하지 않고 여러 줄에 걸친 스트링을 표현하려면 다음과 같이 스트링 안에 \n을 넣어 표현합니다.


const char* str = "안녕하세요.\n반갑습니다.";

결과

안녕하세요.
반갑습니다.

하지만 로 스트링 리터럴을 사용하면 이스케이프 시퀀스를 사용하지 않고 그냥 엔터만 누르면 줄 바꿈이 됩니다.


const char* str = R"(안녕하세요.
반갑습니다.)";

결과

안녕하세요.
반갑습니다.

내부 이스케이프 시퀀스 사용

 

로 스트링 리터럴 안에서는 사용되는 이스케이프 시퀀스를 무시합니다. 예를 들어 탭문자를 나타내는 \t 이스케이프 시퀀스를 사용하면 그냥 문자로 인식되어 \t가 그대로 출력됩니다.


const char* str = R"(이것은 탭문자입니까? \t)";

결과

이것은 탭문자입니까? \t

확장 로 스트링 리터럴(extended raw string literal)

 

로 스트링 리터럴은 그 안에 )"을 넣을 수 없습니다. 이유는 로 스트링 리터럴)"로 끝나기 때문입니다. 만약 다음과 같이 표현한다면 컴파일 에러가 발생합니다.


const char* str = R"(질문)" 이것은 탭문자입니까?)"; //컴파일 에러

위 문장을 에러 없이 표현하려면 다음과 같이 확장 로 스트링 리터럴로 표현해야 합니다.


R"d-char-sequence(r-char-sequence)d-char-sequence"

r-char-sequence 부분이 실제 로 스트링이고 좌/우의 d-char-sequence는 구분자 시퀀스로 반드시 로 스트링 리터럴의 시작과 끝에 똑같이 나와야 합니다. 

 

구분자 시퀀스최대 16개의 문자를 가질 수 있으며, 로 스트링 리터럴 안에 나오지 않는 값으로 지정해야 합니다.


const char* str1 = R"&(질문) 이것은 "(탭문자)"입니까?)&";
const char* str2 = R"aa(질문) 이것은 "(탭문자)"입니까?)aa";

결과

질문) 이것은 "(탭문자)"입니까?
질문) 이것은 "(탭문자)"입니까?

[참고]

1. 전문가를 위한 c++(개정4)  (저자 : 마크 그레고리 / 옮긴이 남기혁)

댓글