programing

스트링 리터럴에 헥스 이스케이프를 적절히 추가하는 방법은?

firstcheck 2022. 7. 30. 12:19
반응형

스트링 리터럴에 헥스 이스케이프를 적절히 추가하는 방법은?

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 번역 단계

    ...

    1. 문자 상수 및 문자열 리터럴의 각 소스 문자 집합 부재 및 이스케이프 시퀀스를 실행 문자 집합의 대응하는 멤버로 변환하고, 대응하는 멤버가 없는 경우에는 늘(와이드) 문자 이외의 구현 정의 멤버로 변환한다.8)

    2. 인접한 문자열 리터럴 토큰이 연결됩니다.

문자열 리터럴은 컴파일 프로세스 초기에 합성되지만 이스케이프 문자 변환 후에는 다음과 같이 사용할 수 있습니다.

char problem[] = "abc\x12" "e";

가독성을 위해 완전 분리를 선호할 수 있습니다.

char problem[] = "abc" "\x12" "e";

우리 중 언어변호사들에게 이 내용은C11 5.1.1.2 Translation phases(중요) :

  1. 문자 상수 및 문자열 리터럴 내의 각 소스 문자 집합 부재이스케이프 시퀀스를 실행 문자 집합의 대응하는 멤버로 변환하고, 대응하는 멤버가 없는 경우에는 늘(와이드) 문자 이외의 구현 정의 멤버로 변환한다.

  2. 인접한 문자열 리터럴 토큰이 연결됩니다.

왜 물어보는 거지?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

반응형