#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 |