CPP_어소_39_문자열 문제

CJB_ny·2022년 6월 23일
0

CPP_AROTHO

목록 보기
37/83
post-thumbnail
post-custom-banner

wcscmp 함수 구현

    1. 문자열 두개를 받는다.
    1. 문자열의 길이를 비교한다.

      길이가 누구 하나 더 짧은쪽 -1 | 1 반환

    1. 길이가 같으면 두 문자열의 시작 주소부터 아스키 코드값으로 비교를 한다.
    1. 아스키 코드의 값이 더 작은 쪽이 이기는 것이다.

      비교를 하다가 왼쪽의 아스키 코드 값이 작다면 -1,
      오른쪽의 아스키 코드의 값이 더 작다면 1 반환 후 종료

  • 5, 두개의 값이 같다면 0반환.

중간에 구현을 하다가 드는 생각.

이거 길이를 비교를 할 필요가 없네

그냥 아무것도 없으면 그것은 '\0' 이니까

짧은게 무조건 이김.

계획 수정

    1. while 문을 돈다.
    1. 아스키 코드 값의 대소 비교를한다.
    1. 각각의 같은 인덱스 번호를 비교를 하면서 더 작은쪽의 아스키 코드 값을 구한다.
unsigned int GetLen(const wchar_t* str)
{
	unsigned int i = 0;
	while ('\0' != *(str + i))
	{
		++i;
	}

	return i;
}

void strCat(wchar_t* destSrc, unsigned int destLen, const wchar_t* source)
{
	int destSrcLen = GetLen(destSrc);
	int srcLen = GetLen(source);

	if (destSrcLen + srcLen + 1> destLen)
	{
		printf("Error!\n");
	}

	for (int i = 0; i < srcLen + 1; ++i)
	{
		destSrc[destSrcLen + i] = *(source + i);
	}

}

int GetCmp(const wchar_t* leftStr, const wchar_t* rightStr)
{
	int indexNumLen;
	int loopNum = 0;
	int result;

	int leftLen = GetLen(leftStr);
	int rightLen = GetLen(rightStr);

	//loopNum = ( leftLen < rightLen ) ? loopNum = leftLen : loopNum = rightLen;

	if (leftLen < rightLen)
		indexNumLen = rightLen;
	else if (leftLen > rightLen)
		indexNumLen = leftLen;
	else
		indexNumLen = leftLen;

	// 1. while문을 돈다.
	while (loopNum <= indexNumLen)
	{
		// 2. 같은 인덱스 번호에서 아스키 코드의 값을 비교를 해준다.
		int leftValue = *(leftStr + loopNum);
		int rightValue = *(rightStr + loopNum);

		if (leftValue < rightValue)
		{
			printf("left가 더 작다\n");
			result = 1;
			break;
		}
		else if (leftValue > rightValue)
		{
			printf("right가 더 작다.\n");
			result = -1;
			break;
		}
		else
		{
			printf("두 수가 같다\n");
			result = 0;
		}

		++loopNum;
	}

	return result;
}

int main(void)
{
	wchar_t left[10] = L"eabcd";
	wchar_t right[10] = L"abc";

 	int result = GetCmp(left, right);
	printf("%d\n", result);

	return 0;
}

나는 일단 이렇게함

내가 안거

문자형 자료형에 문자 넣은것을
정수형으로 받아오면 그거 아스키 코드 값으로 바뀐다.

아스키 코드로 치면은 b가 c보다 앞쪽에 배치되어있다.

"문자"에 해당하는 실제 숫자이다.

메모리상에 숫자가 들어가 있는 것이다.

문자로 해석했을 때 b, c로 보이는 것 뿐이다.


삼항 연산자

병신 처럼

loopNum = ( leftLen < rightLen ) ? loopNum = leftLen : loopNum = rightLen;

이렇게 했는데 이게 아니라

loopNum = ( leftLen < rightLen ) ? leftLen : rightLen;

이거 아니노? ㅋㅋ


이렇게 할 경우

이렇게 하면 문자열 길이에 따른 우열 차이는 검사하지 못한다.

내가한거 다시 수정

int GetCmp(const wchar_t* leftStr, const wchar_t* rightStr)
{
	int loopNum = 0;

	int leftLen = GetLen(leftStr);
	int rightLen = GetLen(rightStr);

	if (leftLen < rightLen)
		return -1;
	else if (leftLen > rightLen)
		return 1;

	// 1. while문을 돈다.
	while (true)
	{
		// 2. 같은 인덱스 번호에서 아스키 코드의 값을 비교를 해준다.
		if (*(leftStr + loopNum) < *(rightStr + loopNum))
			return -1;
		else if (*(leftStr + loopNum) > *(rightStr + loopNum))
			return 1;
		else
			return 0;
		
		++loopNum;
	}
}

int main(void)
{
	wchar_t left[10] = L"abce";
	wchar_t right[10] = L"abc";

 	int result = GetCmp(left, right);
	printf("%d\n", result);

	return 0;
}

뭐 이정도로 해주면됨

인자로 const 포인터로 받아주고

그 안에서 비교문으로 if else if 적절히 사용.

profile
https://cjbworld.tistory.com/ <- 이사중
post-custom-banner

0개의 댓글