스트링 리터럴에 헥스 이스케이프를 적절히 추가하는 방법은?
C에 문자열이 있는 경우 안에 직접 16진수 코드를 추가할 수 있습니다.
char str[] = "abcde"; // 'a', 'b', 'c', 'd', 'e', 0x00
char str2[] = "abc\x12\x34"; // 'a', 'b', 'c', 0x12, 0x34, 0x00
두 예 모두 메모리에 6바이트가 있습니다.이제 가치를 더하고 싶다면 문제가 존재합니다.[a-fA-F0-9]
16진수 입력 후
//I want: 'a', 'b', 'c', 0x12, 'e', 0x00
//Error, hex is too big because last e is treated as part of hex thus becoming 0x12e
char problem[] = "abc\x12e";
가능한 해결책은 정의 후 교체하는 것입니다.
//This will work, bad idea
char solution[6] = "abcde";
solution[3] = 0x12;
이것은 동작할 수 있습니다만, 라고 하면 실패합니다.const
.
//This will not work
const char solution[6] = "abcde";
solution[3] = 0x12; //Compilation error!
올바른 삽입 방법e
끝나고\x12
오류를 유발하지 않고요?
왜 물어보는 거지?UTF-8 문자열을 일정하게 빌드하는 경우 ASCII 테이블을 유지할 수 있는 크기보다 큰 문자의 16진수 값을 사용해야 합니다.
3자리 8진수 사용:
char problem[] = "abc\022e";
또는 문자열을 분할합니다.
char problem[] = "abc\x12" "e";
기능하는 이유:
16진 이스케이프와 달리 표준에서는 3자리가 8진 이스케이프의 최대량으로 정의되어 있습니다.
6.4.4.4 문자 상수
...
octal-escape-sequence: \ octal-digit \ octal-digit octal-digit \ octal-digit octal-digit octal-digit
...
hexadecimal-escape-sequence: \x hexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit
문자열 리터럴 연결은 리터럴 이스케이프 문자 변환보다 늦은 변환 단계로 정의됩니다.
5.1.1.2 번역 단계
...
문자 상수 및 문자열 리터럴의 각 소스 문자 집합 부재 및 이스케이프 시퀀스를 실행 문자 집합의 대응하는 멤버로 변환하고, 대응하는 멤버가 없는 경우에는 늘(와이드) 문자 이외의 구현 정의 멤버로 변환한다.8)
인접한 문자열 리터럴 토큰이 연결됩니다.
문자열 리터럴은 컴파일 프로세스 초기에 합성되지만 이스케이프 문자 변환 후에는 다음과 같이 사용할 수 있습니다.
char problem[] = "abc\x12" "e";
가독성을 위해 완전 분리를 선호할 수 있습니다.
char problem[] = "abc" "\x12" "e";
우리 중 언어변호사들에게 이 내용은C11 5.1.1.2 Translation phases
(중요) :
문자 상수 및 문자열 리터럴 내의 각 소스 문자 집합 부재 및 이스케이프 시퀀스를 실행 문자 집합의 대응하는 멤버로 변환하고, 대응하는 멤버가 없는 경우에는 늘(와이드) 문자 이외의 구현 정의 멤버로 변환한다.
인접한 문자열 리터럴 토큰이 연결됩니다.
왜 물어보는 거지?UTF-8 스트링을 일정하게 빌드하는 경우 ASCII 테이블을 유지할 수 있는 것보다 큰 16진수 값을 사용해야 합니다.
저, 아닙니다.그럴 필요 없어요C11 에서는, 스트링 상수의 프리픽스를 다음과 같이 설정할 수 있습니다.u8
을 알려줍니다
char solution[] = u8"no need to use hex-codes á駵";
(그런데 C++11에서도 같은 기능이 지원되고 있습니다.
언급URL : https://stackoverflow.com/questions/45612822/how-to-properly-add-hex-escapes-into-a-string-literal
'programing' 카테고리의 다른 글
불투명 데이터 유형의 정적 할당 (0) | 2022.07.30 |
---|---|
Vuejs - 템플릿의 헤더 섹션을 부모로 이동 (0) | 2022.07.30 |
오늘 자정과 내일 자정이라는 Java Date 개체를 만들려면 어떻게 해야 합니까? (0) | 2022.07.30 |
Vuex에서 mapState에 액세스하여 표시로 렌더링하는 방법 (0) | 2022.07.30 |
Nuxt.js에서 Navigation Guard를 해결하기 전에 설정하는 방법 (0) | 2022.07.30 |