Unreal 강의

7일차 (12/19)

루인엘다 2023. 12. 19. 10:12

 

printf 함수 만들기 과제 이어서 설명
#include <iostream>

int StringCount(const char* _CPtr)
{
	int Count = 0;
	while (_CPtr[Count])
	{
		++Count;
	}
	return Count;
}

void NumberToString(int _Number, char* _Ptr)
{
	int DivNumber = _Number;
	int SubNumber = _Number;
	int DigitCount = 1;
	while (DivNumber / 10)
	{
		DivNumber /= 10;
		++DigitCount;
	}

	int SubDigit = DigitCount;
	for (int i = 0; i < DigitCount; i++)
	{
		int MulTen = 1;
		for (int x = 0; x < (SubDigit - 1); x++)
		{
			MulTen *= 10;
		}
		_Ptr[i] = (SubNumber / MulTen) + '0';
		SubNumber -= (_Ptr[i] - '0') * MulTen;
		--SubDigit;
	}
}

void MyPrintf(const char* const _Format, ...)
{
	__int64 Address = reinterpret_cast<__int64>(&_Format);

	int Number = StringCount(_Format);
	int Count = 0;

	while (_Format[Count])
	{
		char Ch = _Format[Count];
		if ('%' != Ch)
		{
			putchar(_Format[Count]);
			++Count;
		}
		char NextCh = _Format[Count + 1];

		switch (NextCh)
		{
		case'd':
		{
			++Count;
			Address += 8;
			const int* Ptr = reinterpret_cast<int*>(Address);
			char Arr[100] = {};
			NumberToString(*Ptr, Arr);

			int Index = 0;
			while (Arr[Index])
			{
				putchar(Arr[Index]);
				++Index;
			}
			++Count;
			break;
		}
		default:
		{
			putchar(_Format[Count]);
			++Count;
			break;
		}
		}
	}
}

int main()
{
	MyPrintf("%d count %d index %d %d", 123, 456, 567, 890);
}

 

가변인자가 어떻게 생성되는지를 그림으로 표현했다.

모든 인자는 메모리 영역에서 8바이트씩 떨어져있다.

 

 


방어 코드

내가 알지못하는 메모리를 침범하려고 하는 코드 등이 있을 때, 그런 코드를 막기 위해 사용하는 코드를 방어 코드라고 부른다.

방어 코드의 예시. _Start가 0일 경우 -1을 하면 배열의 -1번째가 되는 것을 방지하기 위함

 


배열
void Fuction(int _Ptr[10])
{
	int Size = sizeof _Ptr;
}

이렇게하면 _Ptr의 크기가 40바이트일거같지만 컴파일러가 자동으로 포인터로 형변환을 하여 8바이트이다.

 

배열의 크기를 함수에서 자동으로 알 수 있는 방법은 없다. 따로 크기를 지정해서 인수로 넣어주던가 해야한다.

 

문자열 파싱을 이용해 전달받은 데이터를 구분해야 할 일이 많다.

 

문자열은 비교도 다른 함수를 사용하여 비교해야한다.

문자열 함수들은 여러가지가 있다.

  • strlen => 문자열 길이
  • strcmp => 문자열 비교
  • strcpy_s => 문자열 복사

등등이 있다.

배열의 숙련도는 포인터의 숙련도와 같다고 볼 수 있다.


단축키
  • Ctrl + A => 전체 선택
  • Ctrl + K + F => 자동 줄맞춤