/* Homework my_printf.c
* 2017-2 Internet Programming
* Written by Choe Hyeong Jin, CS Dept., Univ. of Seoul
*/
#include <stdio.h> // putchar, puts
#include <stdarg.h> // 가변 인자 ... 처리
char *convert(unsigned int num, int base) { // 원하는 진법으로 변환해주는 함수
static char Representation[]= "0123456789ABCDEF";
static char buffer[50]; // 최대 49개의 숫자 표시
char *ptr;
ptr = &buffer[49];
*ptr = '\0'; // 문자열의 끝에는 항상 '\0'을 표시
do {
*--ptr = Representation[num%base];
num /= base;
}while(num != 0); // 진법 변환 후 문자열로 처리
return(ptr);
}
void my_printf(char* format,...) {
char *traverse;
unsigned int i;
char *s;
//1. my_printf의 인수들 초기화하기.
va_list arg;
for(traverse = format; *traverse != '\0'; traverse++) { // 문자열의 끝이 나올 때까지 순회
while( *traverse != '%' ) { // 형식 지정자가 나올때까지
traverse++; // 포인터 증가
}
traverse++; // 형식 지정자 % 다음 글자 위치
//2. 인수들을 가져오고 형식 지정자에 알맞게 출력하기.
switch(*traverse) {
case 'd' : i
= va_arg(arg
,int); // 정수(10진수) 출력 if(i<0) { // 음수일 경우
}
puts(convert
(i
,10)); // 10진수로 변환 후 문자열 출력 break;
case 'o': i
= va_arg(arg
,unsigned int); // 8진수 출력 puts(convert
(i
,8)); // 8진수로 변환 후 문자열 출력 break;
case 's': s
= va_arg(arg
,char *); puts(s
); break; // 문자열 출력 case 'x': i
= va_arg(arg
,unsigned int); // 16진수 출력 puts(convert
(i
,16)); // 16진수로 변환 후 문자열 출력 break;
}
}
//3. 인수 스캔 끝.
}
int main(){
int i=1;
my_printf("i is %d\n", i);
return 0;
}
LyogSG9tZXdvcmsgbXlfcHJpbnRmLmMKICogMjAxNy0yIEludGVybmV0IFByb2dyYW1taW5nCiAqIFdyaXR0ZW4gYnkgQ2hvZSBIeWVvbmcgSmluLCBDUyBEZXB0LiwgVW5pdi4gb2YgU2VvdWwKICovCiNpbmNsdWRlIDxzdGRpby5oPiAvLyBwdXRjaGFyLCBwdXRzCiNpbmNsdWRlIDxzdGRhcmcuaD4gLy8g6rCA67OAIOyduOyekCAuLi4g7LKY66asCgpjaGFyICpjb252ZXJ0KHVuc2lnbmVkIGludCBudW0sIGludCBiYXNlKSB7IC8vIOybkO2VmOuKlCDsp4TrspXsnLzroZwg67OA7ZmY7ZW07KO864qUIO2VqOyImCAKICAgIHN0YXRpYyBjaGFyIFJlcHJlc2VudGF0aW9uW109ICIwMTIzNDU2Nzg5QUJDREVGIjsKICAgIHN0YXRpYyBjaGFyIGJ1ZmZlcls1MF07IC8vIOy1nOuMgCA0OeqwnOydmCDsiKvsnpAg7ZGc7IucCiAgICBjaGFyICpwdHI7IAoKICAgIHB0ciA9ICZidWZmZXJbNDldOyAKICAgICpwdHIgPSAnXDAnOyAvLyDrrLjsnpDsl7TsnZgg64Gd7JeQ64qUIO2VreyDgSAnXDAn7J2EIO2RnOyLnAoKICAgIGRvIHsgCiAgICAgICAgKi0tcHRyID0gUmVwcmVzZW50YXRpb25bbnVtJWJhc2VdOyAKICAgICAgICBudW0gLz0gYmFzZTsgCiAgICB9d2hpbGUobnVtICE9IDApOyAvLyDsp4TrspUg67OA7ZmYIO2bhCDrrLjsnpDsl7TroZwg7LKY66asCgogICAgcmV0dXJuKHB0cik7IAp9Cgp2b2lkIG15X3ByaW50ZihjaGFyKiBmb3JtYXQsLi4uKSB7IAogICAgY2hhciAqdHJhdmVyc2U7IAogICAgdW5zaWduZWQgaW50IGk7CiAgICBjaGFyICpzOyAKCiAgICAvLzEuIG15X3ByaW50ZuydmCDsnbjsiJjrk6Qg7LSI6riw7ZmU7ZWY6riwLgogICAgdmFfbGlzdCBhcmc7IAogICAgdmFfc3RhcnQoYXJnLCBmb3JtYXQpOyAKCiAgICBmb3IodHJhdmVyc2UgPSBmb3JtYXQ7ICp0cmF2ZXJzZSAhPSAnXDAnOyB0cmF2ZXJzZSsrKSB7IC8vIOusuOyekOyXtOydmCDrgZ3snbQg64KY7JisIOuVjOq5jOyngCDsiJztmowKICAgICAgICB3aGlsZSggKnRyYXZlcnNlICE9ICclJyApIHsgLy8g7ZiV7IudIOyngOygleyekOqwgCDrgpjsmKzrlYzquYzsp4AgCiAgICAgICAgICAgIHB1dGNoYXIoKnRyYXZlcnNlKTsgLy8g7ZWc6riA7J6Q7JSpIOy2nOugpQogICAgICAgICAgICB0cmF2ZXJzZSsrOyAgLy8g7Y+s7J247YSwIOymneqwgAogICAgICAgIH0gCgogICAgICAgIHRyYXZlcnNlKys7IC8vIO2YleyLnSDsp4DsoJXsnpAgJSDri6TsnYwg6riA7J6QIOychOy5mAoKICAgICAgICAvLzIuIOyduOyImOuTpOydhCDqsIDsoLjsmKTqs6Ag7ZiV7IudIOyngOygleyekOyXkCDslYzrp57qsowg7Lac66Cl7ZWY6riwLgogICAgICAgIHN3aXRjaCgqdHJhdmVyc2UpIHsgCiAgICAgICAgICAgIGNhc2UgJ2MnIDogaSA9IHZhX2FyZyhhcmcsaW50KTsgcHV0Y2hhcihpKTsgYnJlYWs7IC8vIOusuOyekCDsnbjsiJgg7Lac66ClCiAgICAgICAgICAgIGNhc2UgJ2QnIDogaSA9IHZhX2FyZyhhcmcsaW50KTsgLy8g7KCV7IiYKDEw7KeE7IiYKSDstpzroKUKICAgICAgICAgICAgICAgICAgICAJaWYoaTwwKSB7IC8vIOydjOyImOydvCDqsr3smrAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAtaTsgcHV0Y2hhcignLScpOyAKICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyhjb252ZXJ0KGksMTApKTsgLy8gMTDsp4TsiJjroZwg67OA7ZmYIO2bhCDrrLjsnpDsl7Qg7Lac66ClCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgY2FzZSAnbyc6IGkgPSB2YV9hcmcoYXJnLHVuc2lnbmVkIGludCk7IC8vIDjsp4TsiJgg7Lac66ClCiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMoY29udmVydChpLDgpKTsgLy8gOOynhOyImOuhnCDrs4DtmZgg7ZuEIOusuOyekOyXtCDstpzroKUKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICBjYXNlICdzJzogcyA9IHZhX2FyZyhhcmcsY2hhciAqKTsgcHV0cyhzKTsgYnJlYWs7IC8vIOusuOyekOyXtCDstpzroKUKICAgICAgICAgICAgY2FzZSAneCc6IGkgPSB2YV9hcmcoYXJnLHVuc2lnbmVkIGludCk7IC8vIDE27KeE7IiYIOy2nOugpQogICAgICAgICAgICAgICAgICAgICAgICBwdXRzKGNvbnZlcnQoaSwxNikpOyAvLyAxNuynhOyImOuhnCDrs4DtmZgg7ZuEIOusuOyekOyXtCDstpzroKUKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgIH0gICAKICAgIH0gCgogICAgLy8zLiDsnbjsiJgg7Iqk7LqUIOuBnS4KICAgIHZhX2VuZChhcmcpOyAKfSAKCmludCBtYWluKCl7CglpbnQgaT0xOwoJbXlfcHJpbnRmKCJpIGlzICVkXG4iLCBpKTsKCXJldHVybiAwOwp9