📚책읽기

[C++] 문자열 함수(wcslen, wcscat_s, wcscmp), 함수 구현 과제

공대 컴린이 2022. 3. 13. 22:50
728x90
  • 문자열의 길이 판별 함수
    • wcslen(const wchar_t* _String);
      문자열의 길이를 판별할 때 해당 문자열을 변형시키면 안 되기 때문에 const wchar_t*를 통해 제한을 걸어준다.
    • 직접 구현
/* 문자열의 길이 체크 함수 (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 구현) */
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 문자열의 끝을 만나면 반복 종료
  • 함수 구현 과제 : 문자열의 우선순위를 판별하는 wcscmp 함수를 직접 구현하라
    • wcscmp(const wchar_t* _String1, const wchar_t* _String2);
      wcscmp 함수는 저울 같은 함수이다.
      - 왼쪽 문자열과 오른쪽 문자열이 완벽하게 일치하면 0
      - 왼쪽이 더 우열이 높은 경우 1 (사전 순서로 후위)
      - 오른쪽이 더 우열이 높은 경우 -1
      - Hint: 우열을 가릴 땐 아스키코드로 비교한다.
    • 과제 풀이 내용
/* 과제 풀이 : 문자열의 우선순위 비교 구현 (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