C 및 C ++에서 표 형식 문자를 이스케이프해야합니까?
C 및 C ++ (및 기타 여러 언어)에서 문자 및 문자열 상수의 가로 표 작성기 (ASCII 코드 9)는 이스케이프 형식으로 '\t'
및 로 표시됩니다 "\t"
. 그러나 예를 들어 "A B"
(betreen A
및 에는 TAB이 있음) 과 같이 문자열 리터럴에 이스케이프되지 않은 표 작성기 문자를 정기적으로 입력 B
하고 있으며 적어도 clang ++는 귀찮게 보이지 않습니다. 문자열은 "A\tB"
. 긴 들여 쓰기 된 여러 줄 문자열이 소스 코드에서 더 잘 읽을 수 있기 때문에 이스케이프 처리되지 않은 버전이 더 좋습니다.
이제 나는 이것이 일반적으로 C 및 C ++에서 합법적인지 아니면 내 컴파일러에서 지원하는지 스스로에게 묻고 있습니다. 문자 및 문자열 상수에서 이스케이프되지 않은 표 작성기는 얼마나 이식 가능합니까?
놀랍게도 내가 구글이나 유래에 어느 쪽이 단순 해 보이는 질문에 대한 답을 찾을 수 없습니다 (난 그냥 발견 이 희미하게 관련 질문에).
예, 적어도 C ++ 11에 따라 문자열 또는 문자 리터럴에 탭 문자를 포함 할 수 있습니다. 허용되는 문자는 다음과 같습니다.
큰 따옴표 , 백 슬래시 또는 개행 문자를 제외한 소스 문자 세트 의 모든 구성원
"
\
( C ++ 11 표준 , 부록 A.2에서)
소스 문자 세트에는 다음이 포함됩니다.
공백 문자, 가로 탭 , 세로 탭, 용지 공급 및 줄 바꾸기를 나타내는 제어 문자 및 다음 91 개의 그래픽 문자
( C ++ 11 표준 , 2.3.1 단락)
업데이트 : 나는 당신이 두 가지 다른 언어에 대해 묻고 있다는 것을 방금 알아 챘습니다. C99의 경우도 그렇습니다. 문구는 다르지만 기본적으로 같은 말을합니다.
문자 상수 또는 문자열 리터럴에서 실행 문자 집합의 구성원은 소스 문자 집합 의 해당 구성원 또는 [...]
소스 및 실행 문자 세트 모두
가로 탭 , 세로 탭 및 용지 공급을 나타내는 제어 문자 .
탭 문자를 문자열이나 문자 리터럴에 직접 넣는 것은 완전히 합법적입니다. C 및 C ++ 표준은 탭 문자를 포함하는 소스 문자 세트를 요구하며, 문자열 및 문자 리터럴은 백 슬래시, 따옴표 또는 아포스트로피 (적절한 경우) 및 개행을 제외하고 소스 문자 세트의 모든 문자를 포함 할 수 있습니다.
그래서 그것은 휴대용입니다. 그러나 독자가 다른 종류의 공백을 구분할 수있는 방법이 없기 때문에 좋은 생각이 아닙니다. 또한 텍스트 편집기, 메일 프로그램 등에서 탭을 다시 포맷하는 것은 매우 일반적이므로 이러한 작업 과정에서 프로그램에 버그가 발생할 수 있습니다.
입력에 탭을 입력하면 문자열에 리터럴 탭 문자가 포함되고 탭 문자로 유지됩니다 \t
. 내부적 으로 마술처럼 번역되지 않습니다 .
코드 작성도 마찬가지입니다. 문자열에 리터럴 탭 문자를 포함 할 수 있습니다. 그러나 다음을 고려하십시오.
T T T <--tab stops
012345012345012345012345
foo1 = 'a\tb';
foo2 = 'a b'; // pressed tab in the editor
foo3 = 'a b'; // hit space twice in the editor
당신이 사이의 공백에 커서를하지 않는 한 a
그리고 b
거기에 얼마나 많은 문자 확인이의 탭이나 실제 공백 문자가 있는지 결정하기 위해 기본적으로 방법이 없습니다. 그러나 \t
버전에서는 즉시 탭으로 표시됩니다.
TAB 키를 누르면 시스템이 해당 키를 매핑하는 코드 포인트를 얻을 수 있습니다. 해당 코드 포인트는 프로그램이 실행되는 시스템의 탭일 수도 있고 아닐 수도 있습니다. \ t를 리터럴에 넣으면 컴파일러는이를 대상 시스템에 적합한 코드 포인트로 대체합니다. 따라서 프로그램이 실행되는 시스템에 탭이 있는지 확인하려면 \ t를 사용하십시오. 그게 직업입니다.
'programing' 카테고리의 다른 글
드롭 다운 목록의 너비는 어떻게 변경합니까? (0) | 2021.01.14 |
---|---|
Key에 무엇이든 담을 수있는 Dictionary를 만드는 방법? (0) | 2021.01.14 |
Firefox에서 Blob createObjectURL 다운로드가 작동하지 않음 (그러나 디버깅 할 때 작동 함) (0) | 2021.01.14 |
Android에서 개발 모드 및 릴리스 모드 환경 설정 구별 (0) | 2021.01.14 |
HTML 텍스트 입력에서 텍스트를 선택할 때 강조 색상 변경 (0) | 2021.01.14 |