문제)
%d, %f, %s, %c 형식 코드를 처리할 수 있는 간단한 printf 함수를 구현해보자. ANSI 표준에서의 다른 형식 코드에 대한 동작은 정의되지 않는다. 그 타입의 값들을 출력하는 함수 print_integer, print_float가 있다고 가정하고 그 외에 모든 것들의 출력은 putchar를 사용한다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#define MAX_NUMBER 1000000
/*
printf 함수의 %d, %s, %c 구현. (%f는 추후 구현)
가변인수로 받아서 print함수로 구현
*/
void print(char *string, ...);
int main(){
char arr[] = "hello";
int len, i;
int a = 10;
char c = 'a';
print("%%d : %d\t\t%%s : %s\t%%c : %c\n", a, arr, c);
getchar();
return EXIT_SUCCESS;
}
void print(char *string, ...){
va_list va_arg;
char number[MAX_NUMBER];
int i, len;
int d;
char c;
//double f;
char *s;
va_start(va_arg,string);
/*
입력 받은 string을 하나하나 비교해가며 putchar()로 찍어주다가
%d, %s, %c를 만났을 때 가변 인수 순서대로 그 값을 받아준 후
포인터를 증가해서 다시 string을 출력해간다.
*/
while(*string != NULL){
if(*string == '%'){
string++;
if(*string == 'd'){
d = va_arg(va_arg,int);
itoa(d,number,10); // 정수를 문자열로 변환
len = strlen(number);
for(i = 0; i < len; i++){
putchar(number[i]);
}
goto last; // 다음 string 포인터로 확인하기 위해 넘겨줌
}
else if(*string == 'f'){
// 실수를 문자열로 구현할 수 있는 함수 필요...찾아봐서 없으면 직접 구현 필요
}
else if(*string == 's'){
s = va_arg(va_arg,char *);
len = strlen(s);
for(i = 0; i < len; i++){
putchar(s[i]);
}
goto last;
}
else if(*string == 'c'){
c = va_arg(va_arg, int);
putchar(c);
goto last;
}
}
putchar(*string);
last: string++;
}
va_end(va_arg);
}
[출처] printf 함수 구현|작성자 사랑인