* 문자셋(Character Sets)
약속된 문자의 표현 방법
대표적으로 아스키코드(ASCII CODE)와 유니코드(UNICODE)가 있다
* 문자열의 형태
1. SBCS(Single Byte Character Set)
문자를 표현하는데 있어서 1바이트만 사용, 아스키 코드가 이에 해당
2. MBCS(Multi Byte Character Set)
다양한 바이트 수를 이용하여 문자를 표현하는 방식, 어떤 문자는 1바이트로 어떤 문자는 2바이트로 표현
3. WBCS(Wide Byte Character Set)
모든 문자를 2바이트로 처리, 유니코드
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "ABC한글";
int size = sizeof(str);
int len = strlen(str);
printf("배열의 크기: %d\n", size);
printf("문자열의 길이: %d\n", len);
return 0;
}
ㄴ ABC 3바이트 + 한글 4바이트 + NULL문자 1바이트 = 8바이트
ㄴ 글자수는 7글자(NULL 제외)
ㄴ MBCS 기반임
#include <stdio.h>
int main(void)
{
char str[] = "한글입니다";
int i;
for (i = 0; i < 5; i++)
fputc(str[i], stdout);
fputs("\n", stdout);
for (i = 0; i < 10; i++)
fputc(str[i], stdout);
fputs("\n", stdout);
return 0;
}
ㄴ 이러한 문제를 해결책이 될 수 있는 것이 바로 WBCS 방식임
* WBCS 기반의 프로그래밍
1. char를 대신하는 wchar_t
2. "ABC"를 대신하는 L"ABC"
3. strlen을 대신하는 wcslen
#include <stdio.h>
#include <string.h>
int main(void)
{
wchar_t str[] = L"ABC";
int size = sizeof(str);
int len = sizeof(str);
printf("배열의 크기: %d\n", size);
printf("문자열 크기: %d\n", len);
return 0;
}
#include <stdio.h>
#include <string.h>
int main(void)
{
wchar_t str[] = L"ABC";
int size = sizeof(str);
int len = wcslen(str);
printf("배열의 크기: %d\n", size);
printf("문자열 크기: %d\n", len);
return 0;
}
* 문자열 조작 함수
SBCS | WBCS |
strlen | wcslen |
strcpy | wcscpy |
strncpy | wcsncpy |
strcat | wcscat |
strncat | wcsncat |
strcmp | wcscmp |
strncmp | wcsncmp |
* 문자열 입출력 함수
SBCS | WBCS |
printf | wprintf |
scanf | wscanf |
fgets | fgetws |
fputs | fputws |
#include <stdio.h>
#include <string.h>
int main(void)
{
wchar_t str[] = L"ABC";
int size = sizeof(str);
int len = wcslen(str);
wprintf(L"Array Size: %d\n", size);
wprintf(L"String Length: %d\n", len);
return 0;
}
#include <stdio.h>
//int main(int argc, char* argv[])
int wmain(int argc, wchar_t* argv[])
{
int i;
for (i = 0; i < argc; i++)
{
fputws(argv[i], stdout);
fputws(L"\n", stdout);
}
return 0;
}
* windows.h는 Windows 기반 프로그래밍을 하는데 있어서 기본적으로 항상 포함해야 하는 헤더 파일이다
* Windows에서 정의하고 있는 자료형
char | CHAR |
wchar_t | WCHAR |
const | CONST |
CHAR* | LPSTR |
CONST CHAR* | LPCSTR |
WCHAR* | LPWSTR |
CONST WCHAR* | LPCWSTR |
#include <stdio.h>
#include <windows.h>
int wmain(int argc, wchar_t* argv[])
{
LPCSTR str1 = "SBCS Style String 1";
LPCWSTR str2 = L"WBCS Style String 1";
CHAR arr1[] = "SBCS Style String 2";
WCHAR arr2[] = L"WBCS Style String 2";
LPCSTR cStr1 = arr1;
LPCWSTR cStr2 = arr2;
printf("%s\n", str1);
printf("%s\n", arr1);
wprintf(L"%s\n", str2);
wprintf(L"%s\n", arr2);
return 0;
}
* MBCS와 WBCS(유니코드)를 동시에 지원하기 위한 매크로
UNICODE와 _UNICODE 매크로가 존재하면 유니코드, 없으면 MBCS 방식의 컴파일이 가능
WCHAR, CHAR | TCHAR |
LPWSTR, LPSTR | LPTSTR |
LPCWSTR, LPCSTR | LPCTSTR |
//#define UNICODE
//#define _UNICODE
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
int wmain(void)
{
TCHAR str[] = _T("1234567");
int size = sizeof(str);
printf("string length : %d \n", size);
return 0;
}
[만약] UNICODE 매크로가 꺼져 있는데도 결과가 16이 나왔다면,
프로젝트 > 속성 > 구성속성 > 고급 > 문자집합에 유니코드로 되어 있는지 확인하기
* MBCS와 WBCS(유니코드)를 동시에 지원하기 위한 함수들
_tmain |
_tcslen |
_tcscat |
_tcscpy |
_tcsncpy |
_tcscmp |
_tcsncmp |
_tprintf |
_tscanf |
_fgetts |
_fputts |
#define UNICODE
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
int _tmain(int argc, TCHAR* argv[])
{
LPCTSTR str1 = _T("MBCS of WBCS 1");
TCHAR str2[] = _T("MBCS of WBCS 2");
TCHAR str3[100] = { 0 };
TCHAR str4[50] = { 0 };
LPCTSTR pStr = str1;
_tprintf(_T("string size: %d\n"), sizeof(str2));
_tprintf(_T("string length: %d\n"), _tcslen(pStr));
_fputts(_T("Input String 1 : "), stdout);
_tscanf_s(_T("%s"), str3, _countof(str3));
_fputts(_T("Input String 2 : "), stdout);
_tscanf_s(_T("%s"), str4, _countof(str4));
_tcscat_s(str3, _countof(str3), str4);
_tprintf(_T("String 1 + String 2 : %s\n"), str3);
return 0;
}
* 문자 개수를 알고 싶을 때 _tcslen(str)
* 배열의 전체 크기(바이트)를 알고 싶을 때 sizeof(str)
* 문자열 버퍼 크기를 알고 싶을 때 _countof(str)
* 해당 글은 윤성우의 뇌를 자극하는 윈도우즈 시스템 프로그래밍 도서를 읽고 정리한 글입니다
https://product.kyobobook.co.kr/detail/S000001223395
'IT공부 > IT서적' 카테고리의 다른 글
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 4장. 컴퓨터 구조 - 2 (0) | 2024.12.24 |
---|---|
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 3장. 64비트 기반 프로그래밍 (0) | 2024.12.21 |
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 1장. 컴퓨터 구조 - 1 (0) | 2024.12.20 |
[윤성우 열혈 C++프로그래밍] Part4. 객체지향의 완성 - 2 (0) | 2024.09.24 |
[윤성우 열혈 C++프로그래밍] Part4. 객체지향의 완성 - 1 (0) | 2024.09.21 |