728x90
- 문자열의 길이 판별 함수
- wcslen(const wchar_t* _String);
문자열의 길이를 판별할 때 해당 문자열을 변형시키면 안 되기 때문에 const wchar_t*를 통해 제한을 걸어준다. - 직접 구현
- wcslen(const wchar_t* _String);
/* 문자열의 길이 체크 함수 (wcslen 구현) */
unsigned int GetLength(const wchar_t* _pStr)
{
// 문자 개수 체크 용도
int i = 0;
while ('\0' != _pStr[i])
{
++i;
}
return i;
}
- 문자열 이어 붙이는 함수
- wcscat_s(wchar_t* _pDest, unsigned int _iBufferSize, const wchar_t* _pSrc);
- 매개변수는 "이어 붙어질 문자열(_pDest)", "이어 붙어질 문자열의 크기(_iBufferSize)", "이어 붙일 문자열(_pSrc)"으로 총 세 가지이다.
1. 이어 붙어질 문자열은 다른 문자열이 이어져 변형이 가능해야 하므로 const를 붙이지 않는다.
2. 문자열의 크기는 음수가 될 수 없으므로 unsigned로 선언하였다.
3. 이어 붙일 문자열은 변형되면 안 되므로 const를 붙였다. - 직접 구현
- wcscat_s(wchar_t* _pDest, unsigned int _iBufferSize, const wchar_t* _pSrc);
/* 문자열 이어 붙이기 구현 (wcscat_s 구현) */
void StrCat(wchar_t* _pDest, unsigned int _iBufferSize, const wchar_t* _pSrc)
{
int iDestLen = GetLength(_pDest);
int iSrcLen = GetLength(_pSrc);
if (_iBufferSize < iDestLen + iSrcLen + 1) // Null 문자 공간까지 계산(+1)
{
// 경고문을 띄워주는 기능
assert(nullptr);
}
for (int i = 0; i < iSrcLen+1; ++i)
{
_pDest[iDestLen + i] = _pSrc[i];
}
}
-
- wcscat_s 함수를 구현하기 위해 필요한 단계를 적어보고, 하나씩 구현하며 최종 완성하였다.
1. Dest 문자열의 끝을 확인 (문자열이 이어 붙을 시작 위치) -> iDestLen;
2. 반복적으로 Src 문자열을 Dest 끝 위치에 복사하기
3. Src 문자열의 끝을 만나면 반복 종료
- wcscat_s 함수를 구현하기 위해 필요한 단계를 적어보고, 하나씩 구현하며 최종 완성하였다.
- 함수 구현 과제 : 문자열의 우선순위를 판별하는 wcscmp 함수를 직접 구현하라
- wcscmp(const wchar_t* _String1, const wchar_t* _String2);
wcscmp 함수는 저울 같은 함수이다.
- 왼쪽 문자열과 오른쪽 문자열이 완벽하게 일치하면 0
- 왼쪽이 더 우열이 높은 경우 1 (사전 순서로 후위)
- 오른쪽이 더 우열이 높은 경우 -1
- Hint: 우열을 가릴 땐 아스키코드로 비교한다. - 과제 풀이 내용
- wcscmp(const wchar_t* _String1, const wchar_t* _String2);
/* 과제 풀이 : 문자열의 우선순위 비교 구현 (wcscmp 구현)*/
int StrComparison(const wchar_t* Str1, const wchar_t* Str2)
{
int i = 0;
const wchar_t* big = GetLength(Str1) >= GetLength(Str2) ? Str1 : Str2;
while ('\0' != big[i])
{
if (Str1[i] > Str2[i])
{
return 1;
}
else if(Str1[i] < Str2[i])
{
return -1;
}
++i;
}
return 0;
}
-
- 풀이 내용
먼저 두 문자열의 길이 중 어느 것이 더 긴 문자열인지를 찾았다.
그 후 더 긴 문자열의 끝이 닿을 때까지 양쪽 문자열을 하나씩 비교하였다. - 강의 속 구현 정답
- 풀이 내용
/* wcscmp 구현 강의 정답 */
int StrCmp(const wchar_t* _left, const wchar_t* _right)
{
int leftLen = GetLength(_left);
int rightLen = GetLength(_right);
int iLoop = leftLen;
int iReturn = 0;
if (leftLen < rightLen)
{
iLoop = leftLen;
iReturn = -1;
}
else if(leftLen > rightLen)
{
iLoop = rightLen;
iReturn = 1;
}
for (int i = 0; i < iLoop; ++i)
{
if (_left[i] < _right[i])
{
return -1;
}
else if(_left[i] > _right[i])
{
return 1;
}
}
return iReturn;
}
-
- 강의 속 풀이와 내 풀이의 다른 점
1. 강의에서는 두 문자열의 길이가 다른 경우를 판별하기 위해 문자열의 길이를 비교하여 초기 Return 값을 설정해 주었다.
2. 반복문을 크기가 더 작은 문자열의 크기만큼 수행시켰다.
나는 반복문을 더 큰 문자열의 크기만큼 수행시켰기 때문에 더 작은 문자열의 널값('\0')과 큰 문자열의 문자(a)가 비교되도록 구현하였다.
- 강의 속 풀이와 내 풀이의 다른 점
728x90
'📚책읽기' 카테고리의 다른 글
[C++] 동적할당(malloc) (0) | 2022.04.04 |
---|---|
[C++] 구조체와 포인터 (0) | 2022.04.04 |
[C++] 문자, 문자열(char, wchar_t, const wchar_t*) (0) | 2022.03.09 |
[C/C++] const 포인터, void 포인터 (0) | 2022.03.09 |
[C/C++] 포인터 이해 확인 문제 (0) | 2022.03.07 |