|
printfなどの可変個引数を受け取る関数を作るには staarg.h で定義さ
れているマクロを利用します。
これは簡易版ですが、printfは意外に奥が深いので、きちんとしたもの
を作ろうとしたら結構大変です。
#include <stdio.h>
#include <stdarg.h>
int my_printf(const char *fmt, ...)
{
va_list ap;
const char *p;
int n = 0;
va_start(ap, fmt);
for (p = fmt; *p; p++) {
if (*p != '%') {
putchar(*p), n++;
continue;
}
switch (*++p) {
case '%':
putchar('%'), n++;
break;
case 'c':
{ int c = va_arg(ap, int);
putchar(c), n++;
break;
}
case 's':
{ char *s = va_arg(ap, char*);
while (*s) putchar(*s++), n++;
break;
}
case 'd':
{ int i = 0, v = va_arg(ap, int);
char buf[10];
if (v < 0) {
putchar('-'), n++;
v = -v;
}
do
buf[i++] = v % 10;
while (v /= 10);
while (--i >= 0) putchar(buf[i] + '0'), n++;
break;
}
}
}
va_end(ap);
return n;
}
|