素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

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);
}