유 니 코드 초기 분석
차 트 데이터 형태
C 프로그램 에서 char 데이터 형식 을 사용 하여 문자 와 문자열 을 정의 하고 저장 하 는 것 에 익숙 하 다 고 가정 합 니 다.그러나 C 가 와 이 드 문 자 를 어떻게 처리 하 는 지 이해 하기 위해 서 는 Win 32 프로그램 에 나타 날 수 있 는 표준 문자 정 의 를 살 펴 보 자.
다음 문 구 는 한 글자 만 포함 하 는 변 수 를 정의 하고 초기 화 합 니 다.
char c = 'A' ;
변수 c 는 1 개의 바이트 로 저장 하고 16 진수 0x 41 로 초기 화 합 니 다. 이것 은 알파벳 A 의 ASCII 코드 입 니 다.
이렇게 문자열 을 가리 키 는 지침 을 정의 할 수 있 습 니 다:
char * p ;
윈도 우 는 32 비트 운영 체제 이기 때문에 포인터 변수 p 는 4 개의 바이트 로 저장 해 야 합 니 다.가리 키 는 문자열 의 지침 을 초기 화 할 수 있 습 니 다:
char * p = "Hello!" ;
앞에서 처럼 변수 p 도 4 개의 바이트 로 저장 해 야 합 니 다.이 문자열 은 정적 메모리 에 저장 되 어 있 으 며 7 개의 바이트 - 6 개의 바이트 로 문자열 을 저장 하고 다른 1 개의 바이트 로 종료 기호 0 을 저장 합 니 다.
문자 배열 을 이렇게 정의 할 수 있 습 니 다:
char a[10] ;
이런 상황 에서 컴 파일 러 는 이 배열 에 10 바이트 의 저장 공간 을 남 겨 두 었 다.표현 식 sizeof (a) 는 10 을 되 돌려 줍 니 다.배열 이 전체 변수 (즉, 모든 함수 밖에서 정의) 라면 아래 의 문 구 를 사용 하여 문자 배열 을 초기 화 할 수 있 습 니 다.
char a[] = "Hello!" ;
이 배열 을 함수 의 영역 변수 로 정의 하려 면 static 변수 로 정의 해 야 합 니 다. 다음 과 같 습 니 다.
static char a[] = "Hello!" ;
어떤 경우 에 도 문자열 은 정적 프로그램 메모리 에 저장 되 고 끝 에 0 을 추가 하면 7 바이트 의 저장 공간 이 필요 합 니 다.
너비 문자
유 니 코드 나 넓 은 문 자 는 char 데이터 형식 이 C 에 있 는 의 미 를 바 꾸 지 않 았 습 니 다.char 는 1 바이트 의 저장 공간 을 계속 표시 하고 sizeof (char) 는 1 을 계속 되 돌려 줍 니 다.이론 적 으로 C 에서 1 개의 바이트 가 8 비트 보다 길 지만 우리 대부분 에 게 1 개의 바이트 (즉 1 개의 char) 는 8 비트 너비 이다.
C 의 넓 은 문 자 는 wchar 기반 입 니 다.t 데이터 형식 은 WCHAR. H 를 포함 한 몇 개의 헤더 파일 에 정의 되 어 있 습 니 다. 이렇게:
typedef unsigned short wchar_t ;
그래서 wchart 데이터 형 태 는 부호 가 없 는 짧 은 정수 형 태 는 모두 16 비트 너비 이다.
넓 은 문 자 를 포함 하 는 변 수 를 정의 하려 면 다음 문 구 를 사용 하 십시오.
wchar_t c = 'A' ;
변수 c 는 두 바이트 값 0x 0041 로 유 니 코드 가 표시 하 는 알파벳 A 입 니 다.(단, Intel 마이크로프로세서 가 최소 바이트 부터 다 중 바이트 수 치 를 저장 하기 때문에 실제 메모리 에 0x 41, 0x 00 순서 로 저 장 됩 니 다. 유 니 코드 문자 의 컴퓨터 저장 을 확인 하려 면 주의해 야 합 니 다.)
넓 은 문자열 을 가리 키 는 지침 도 정의 할 수 있 습 니 다:
wchar_t * p = L"Hello!" ;
첫 번 째 따옴표 앞 에 있 는 대문자 L 에 주의 하 세 요.이것 은 컴 파일 러 에 게 이 문자열 을 넓 은 문자 로 저장 하 는 것 을 알려 줍 니 다. 즉, 모든 문자 가 2 개의 바이트 를 차지 하 는 것 입 니 다.보통 포인터 변수 p 는 4 개의 바이트 를 차지 하고 문자열 변 수 는 14 개의 바이트 가 필요 합 니 다. 문자 마다 2 개의 바이트 가 필요 하고 끝의 0 은 2 개의 바이트 가 필요 합 니 다.
마찬가지 로, 아래 문장 으로 넓 은 문자 그룹 을 정의 할 수 있 습 니 다.
static wchar_t a[] = L"Hello!" ;
이 문자열 도 14 바이트 의 저장 공간 이 필요 합 니 다. sizeof (a) 는 14 를 되 돌려 줍 니 다.색인 배열 a 는 단독 문 자 를 얻 을 수 있 습 니 다.a [1] 의 값 은 넓 은 문자 'e' 또는 0x 0065 입 니 다.
인쇄 기호 처럼 보이 지만 첫 번 째 따옴표 앞 에 있 는 L 은 매우 중요 하고 두 기호 사이 에 빈 칸 이 없어 야 한다.L 이 있어 야만 컴 파 일 러 는 문자열 을 각각 2 바이트 로 저장 해 야 한 다 는 것 을 알 수 있 습 니 다.나중에 변수 정의 대신 넓 은 문자열 을 사용 하 는 것 을 보 았 을 때 첫 번 째 따옴표 앞 에 있 는 L 을 만 날 수 있 습 니 다.다행히도 L 포함 을 잊 어 버 리 면 C 컴 파 일 러 가 경고 나 오류 메 시 지 를 보 내 는 경우 가 많다.
하나의 문자 앞 에 L 접 두 사 를 사용 하여 넓 은 문자 로 해석 해 야 한 다 는 것 을 표시 할 수 있 습 니 다.다음 과 같다.
wchar_t c = L'A' ;
그러나 일반적으로 이것 은 불필요 하 다. C 컴 파 일 러 는 이 문 자 를 넓 은 문자 로 확장 할 것 이다.
와 이 드 문자 링크 라 이브 러 리 함수
우 리 는 문자열 의 길 이 를 어떻게 얻 는 지 안다.예 를 들 어, 만약 우리 가 아래 와 같이 문자열 지침 을 정의 했다 면:
char * pc = "Hello!" ;
우 리 는 호출 할 수 있다.
iLength = strlen (pc) ;
이 때 변 수 는 iLength 가 6, 즉 문자열 의 문자 수 입 니 다.
너무 좋아!이제 넓 은 문 자 를 가리 키 는 지침 을 정의 해 봅 시다.
wchar_t * pw = L"Hello!" ;
strlen 다시 호출:
iLength = strlen (pw) ;
이제 귀찮아.우선, C 컴 파 일 러 는 경고 메 시 지 를 표시 합 니 다. 아마도 다음 과 같은 내용 일 것 입 니 다.
'function' : incompatible types - from 'unsigned short *' to 'const char *'
이 메 시 지 는 strlen 함 수 를 설명 할 때 이 함 수 는 char 형식의 지 표를 받 아야 하지만 지금 은 unsigned short 형식의 지 표를 받 았 다 는 뜻 이다.이 프로그램 을 컴 파일 하고 실행 할 수 있 지만 iLength 는 1 과 같 습 니 다.왜?
문자열 "Hello!" 의 6 글자 가 16 자 리 를 차지 합 니 다:
0x0048 0x0065 0x006C 0x006C 0x006F 0x0021
Intel 프로세서 메모리 에 저장:
48 00 65 00 6C 00 6C 00 6F 00 21 00
strlen 함수 가 문자열 의 길 이 를 얻 으 려 고 시도 하고 있 으 며, 첫 번 째 바이트 를 문자 로 계산 하기 시 작 했 으 나, 다음 바이트 가 0 이 라면 문자열 이 끝 났 음 을 가정 합 니 다.
이 작은 연습 은 C 언어 자체 와 실행 시기 링크 라 이브 러 리 함수 간 의 차 이 를 명확 하 게 설명 한다.컴 파 일 러 는 문자열 L "Hello!" 를 16 비트 짧 은 정수 형식 데이터 로 해석 하고 wchar 에 저장 합 니 다.t 배열 중.컴 파일 러 는 배열 색인 과 sizeof 연산 자 를 처리 하기 때문에 정상적으로 작 동 할 수 있 지만 연결 할 때 실행 시기 링크 라 이브 러 리 함수, 예 를 들 어 strlen 을 추가 합 니 다.이 함수 들 은 문자열 이 단일 바이트 문자 로 구성 되 어 있다 고 생각 합 니 다.넓 은 문자열 을 만 났 을 때 함 수 는 우리 가 원 하 는 것 처럼 실행 되 지 않 습 니 다.
"아, 너무 귀찮아 요!" 라 고 말 할 수 있 습 니 다. 현재 모든 C 언어 링크 라 이브 러 리 함 수 는 넓 은 문 자 를 받 아들 이기 위해 다시 써 야 합 니 다.그러나 모든 C 언어 링크 라 이브 러 리 함수 가 다시 써 야 하 는 것 은 아 닙 니 다. 문자열 매개 변수 가 있 는 함수 만 다시 써 야 하고 당신 이 완성 할 필요 도 없습니다.그것들 은 이미 다 썼 다.
strlen 함수 의 넓 은 문자 판 은 wcslen (wide - character string length: 넓 은 문자열 길이) 이 고 STRING. H (그 중에서 strlen) 와 WCHAR. H 에 모두 설명 되 어 있 습 니 다.strlen 함수 설명 은 다음 과 같 습 니 다.
size_t __cdecl strlen (const char *) ;
wcslen 함 수 는 다음 과 같다.
size_t __cdecl wcslen (const wchar_t *) ;
이 때 우 리 는 넓 은 문자열 의 길 이 를 얻 으 려 면 호출 할 수 있다 는 것 을 알 았 다.
iLength = wcslen (pw) ;
함 수 는 문자열 의 문자 수 6 을 되 돌려 줍 니 다.넓 은 바이트 로 바 꾼 후 문자열 의 문자 길 이 는 바 뀌 지 않 고 비트 길이 만 바 뀌 었 다 는 것 을 기억 하 세 요.
문자열 인자 가 있 는 모든 C 실행 시기 링크 라 이브 러 리 함수 에는 넓 은 문자 판이 있 습 니 다.예 를 들 어 wprintf 는 printf 의 넓 은 문자 판 입 니 다.이 함수 들 은 WCHAR. H 와 표준 함수 설명 이 포 함 된 헤더 파일 에서 설명 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.