char 타입 : 1 Byte 정수형 자료형 (문자)
// 컴파일 시, 넣은 자료형에 맞게 해석해서 보여줌
char c = 1; // 문자 1~
bool b = 1; // true
int i = 0;
wchar_t wc = 49; // 2 Byte 문자 (`1`)
wc = 65; // 아스키코드 ('A')
wc = 97; // 아스키코드 ('a')
short s = 49; // 49(1)
char c = 1; // 이진값 : 1, 문자 : ~~
c = '1'; // 이진값 : 49, 문자 : '1'
wchar_t wc = 459; // 2 Byte 공간에 459라는 수(이진수)를 넣은 것
wc = "459"; // '4', '5', '9' (문자) => 52, 53, 57 (이진수)
\0charwcharchar c = 'a';
wchar_t wc = L'a'; // 문자를 2 Byte로 표시하겠다는 것.
char szChar[10] = "abcdef";
wchar_t szWChar[10] = L"abcdef";
\0가 있으므로 문자열의 크기 + 1이 실제 크기임short arrShort1[10] = L"abcdef"; // 불가능
short arrShort2[10] = {97,98,99,100,101,102,}; // 정수형 자료형이므로 이렇게 표현
wchar_t szWChar[10] = {97,98,99,100,101,102,}; // 가능
char, wchar_t는 문자를 표현하기 위한 전용 자료형임.char szChar[10] = "abcdef";
wchar_t szWChar[10] = L"abcdef";
const wchar_t* pChar = L"abcdef"; // 이렇게 가능
const wchar_t* pChar = L"abcdef";L : 2 Byte 형태의 문자wchar_t*wchar_t szWChar[10] = L"abcdef";L"abcdef0";wchar_t szWChar[10] : 10칸의 공간을 마련해놓고 하나하나 값을 복사해옴.
wchar_t szWChar[10] = L"abcdef";
const wchar_t* pChar = L"abcdef"; // 이렇게 가능
szWChar[1] = 'z'; // azcdef
// pChar[1] = 'z'; // 어디를 수정하겠다는 것인가? 어떤 b를 가리키는가
szWChar[1] = 'z'; : 값을 복사해온 배열의 b를 변경 => 복사해온 배열을 변경
pChar[1] = 'z'; : 문자열 L"abcdef"의 b를 변경 => 원본을 변경
*(pChar + 1) = 'z'10 = 11; : 이 동작을 하겠다는 것L"abcdef" 같은 값은 ROM:코드 영역에 저장되어 수정이 불가능함.pChar[1] = 'z'; 이 동작은 읽기 전용인 코드 영역에 직접 접근해서 수정하려고 한 것.const wchar_t* pChar;로 선언한 것. (수정을 방지한 것)char : 1 Byte
wchar_t : (Wide Byte) 2 Byte, L을 붙여 사용.
char sz[10] = "abc한글";
wchar_t sz[10] = "abc한글";#include <wchar.h>
int main()
{
wchar_t szName[10] = L"Raimond"; // 문자 자체는 7개
// 문자열의 길이를 반환.
int iLen = wcslen(szName); // const wchar_t* 요구함 (읽기 전용)
// 배열 이름 넣어주어도 상관없음. 배열의 이름은 시작 주소이므로
}
L"Raimond" 의 위치int wcslen(const wchar_t* wCharArr) : 문자열의 길이를 반환unsigned int GetLength(const wchar_t* _pStr)
{
int i = 0;
while (_pStr[i] != '\0') //(*(_pStr + i) != '\0')
{
++i;
}
return i;
}
while ('\0' != _pStr[i])
{
++i;
}
\0 = _pStr[i] 이와 같이 작성하더라도 컴파일 오류로 알수 있음.while (_pStr[i] = '\0')
{
++i;
}
#include <wchar.h>
int main()
{
wchar_t cArr[10] = L"tttttt";
wchar_t c2Arr[20] = L"aaaaaaa";
wcscat_s(c2Arr, cArr); // aaaaaaatttttt
return 0;
}
wcscat_s(wchar_t* destination, const wchar_t* source)wchar_t* destination : 문자열을 더할 결과 변수는 일반 포인터로 받음const wchar_t* source : 문자열에 더할 변수는 const 포인터로 받음 (읽기)함수 오버로딩 Overloading
- 같은 이름의 함수를 매개변수를 달리하여 여러 타입의 매개변수로 사용할 수 있도록 하는 것
함수 오버라이딩 Overriding
- 클래스의 상속관계에서 발생하는 것으로
상위 클래스에서 선언된 가상 virtual, 추상 abstract 메서드를
하위 클래스에서 재정의하는 것.
void Concat(wchar_t* _dest, unsigned int _bufSize, const wchar_t* _src)
{
// _bufSize : 합치다가 원본의 크기를 넘어서면 안되기 때문에 예외처리용으로 받는 것
// 1. dest 문자열 끝 확인
// 2. dest 문자열의 마지막부터 src의 첫글자 ~ 마지막까지 넣기
// 3. src 마지막을 만나면 정지
int destLen = wcslen(_dest);
int srcLen = wcslen(_src);
if (destLen + srcLen > _bufSize - 1) // // null 문자 고려
{
assert(nullptr);
return;
}
for (int i = 0; i < srcLen + 1; ++i) // null 문자까지 포함
_dest[destLen + i] = _src[i];
}
wcscmp 구현
int Compare(const wchar_t* _str1, const wchar_t* _str2)
{
// str1를 기준으로 순회
// 결과가 같은데 str1의 길이가 더 짧다면 str2가 큰것
// 결과가 같은데 str1의 길이가 더 길다면 str1이 큰것
// 순회 중, 값이 다르다면 값이 큰 것을 반환
int str1Len = wcslen(_str1);
int str2Len = wcslen(_str2);
for (int i = 0; i < str1Len; ++i)
{
if (i >= str2Len)
return 1;
int iStr1 = (int)_str1[i];
int iStr2 = (int)_str2[i];
if (iStr1 > iStr2)
return 1;
else if (iStr1 < iStr2)
return -1;
else
continue;
}
if (str1Len == str2Len)
return 0;
else
return -1;
}