printfの可変長引数と型
printfの第二以降の引数にいろいろな型の物を渡せる仕組みについて。
まず、可変長引数を使うためにstdarg.hを#includeする。
#include <stdarg.h>
で、
void myprintf(char *format, ...);
のようにプロトタイプを宣言する。
関数の可変部はどんな型でも受け取ることができ、va_arg(ap, type)
のように引数を取り出す時に型を指定する。
つまり、formatに"%d"が渡されたら、n = va_arg(ap, int)
になるようなswitch文を作る。
#include <stdio.h> #include <stdarg.h> void myprintf(char *, ...); int main(int argc, char **argv) { myprintf("%s = %d\n", "100 + 2", 102); return 0; } void myprintf(char *format, ...) { va_list ap; int isformat = 0; va_start(ap, format); for (; *format; format++) { if (isformat) { switch (*format) { case 'd': printf("%d", va_arg(ap, int)); break; case 's': printf("%s", va_arg(ap,char *)); break; default: putchar(*format); break; } isformat = 0; } else if (*format == '%') { isformat = 1; } else { putchar(*format); } } va_end(ap); }