프로그래밍 / C++ / 언리얼

Programming/C | C++ | Unreal

[C / C++] printf함수 구현 (putchar, putc) 이용

아트성 2022. 5. 4. 12:18
#include <stdio.h>     
#include <stdarg.h>     

void myprintf(const char* format, ...)
{
	va_list args;
	va_start(args, format);

	while (*format)
	{
		if (*format == '%')
		{
			format++;

			if (*format == 0) // %다음에 0이나올수도 있으니 예외처리를 해준다.
			{
				break;
			}

			char* str; // 문자열 출력을 위한 char 타입 1차원 배열 선언
			int val; // 정수형 출력을 위한 int 타입 변수 선언.
			switch (*format)
			{

			case 'c':
				val = va_arg(args, int);
				putchar(val);
				break;

			case 'd':
				val = va_arg(args, int);
				int cnt = 0;
				char arrInt[100] = { 0 };

				// const int isNegative = n & (1 << 31);
				//if (isNegative)
				//{
				//	putchar('-');
				//	n -= 1;
				//	n = ~n;
				//}

				if (val < 0)
				{
					putchar(45);
					val = val * (-1);
				}

				while (val > 0)
				{
					arrInt[cnt] = (val % 10) + 48;
					val /= 10;
					cnt++;
					// 54321, cnt = 5
				}
				
				while (cnt > 0)
				{
					cnt--; // 인덱스 4부터 접근하기위해서 cnt = 5 - 1을 해줘야함.
					putchar(arrInt[cnt]);
				}
				break;

			case 's':
				str = va_arg(args, char*);
				while (*str != NULL)
				{
					putchar(*str);
					str++;
				}
				break;

			case '%':
				putchar(*format);
				break;
			
			default:
				break;
			}
		}

		else
		{
			putchar(*format);
		}
		format++;
	}
	va_end(args);
}


int main ()
{
	char* str1 = "artsung";
	char ch = 'k';
	int val = -12345;
	myprintf("char형 : %c, 문자열 : %s, 정수형 : %d, 소수형 : ", ch, str1, val);
	return 0;
}

va_list args: 가변인자가 들어있는 메모리 주소를 저장하는 포인터를 선언하는 함수이다.

 

va_start(args, format) : 고정인자와 가변인자의 거리의 메모리주소간 거리를 계산해서 포인터가 가리키는곳을 초기화해주는 역할을 하는 함수이다. (format은 ponter to char 문자열 형태로 받은 고정인자이다. )

 

va_arg(args, [TYPE]) : 특정 자료(TPYE)형 크기만큼 값을 가져온다. (int면 4바이트씩, const *char면 8바이트씩 가져온다)

 

va_end : 가변인자를 다사용하고, 반복문이 끝났을 때 포인터가 NULL값을 가리키게 한다.

 

반응형

'Programming > C | C++ | Unreal' 카테고리의 다른 글

[C++] 객체지향 심화.  (1) 2022.06.02
[C / C++] 객체지향 언어 왜 필요한가?  (1) 2022.05.30
[C / C++] 문자열 주요함수 구현.  (0) 2022.05.02
[C++ ] 구조체  (0) 2022.04.15
[C++] rand(), 삼항연산자 이용  (0) 2022.04.12