演習7-3 K&R プログラミング言語C

演習7-3

#include <stdio.h>
#include <stdarg.h>

void minprintf(char *fmt, ...);

int main(void)
{
    char *s = "hello";

    minprintf("\"%s\" is string of s\n", s, s);
    minprintf("%c is \\t\n", '\t');
    minprintf("%x is %%x of 'z'\n", 'z');
    minprintf("%X is %%X of 'z'\n", 'z');
    minprintf("%o is %%o of 'z'\n", 'z');
    minprintf("%p is pointer of \"%s\"\n", s, s);

    return 0;
}

/* minprintf : 可変な引数リストをもつ最小の printf */
void minprintf(char *fmt, ...)
{
    va_list ap; /* 各名なし引数を順々に指す */
    char *p, *sval;
    int ival;
    unsigned int uval;
    double dval;
    void *pval;

    va_start(ap, fmt); /* ap を最初の名なし引数を指すようにする */
    for (p = fmt; *p; p++) {
        if (*p != '%') {
            putchar(*p);
            continue;
        }
        switch (*++p) {
        case 'd':
            ival = va_arg(ap, int);
            printf("%d", ival);
            break;
        case 'f':
            dval = va_arg(ap, double);
            printf("%f", dval);
            break;
        case 's':
            for (sval = va_arg(ap, char *); *sval; sval++) {
                putchar(*sval);
            }
            break;
        case 'c':
            ival = va_arg(ap, int);
            printf("%c", ival);
            break;
        case 'x':
            uval = va_arg(ap, unsigned int);
            printf("%x", uval);
            break;
        case 'X':
            uval = va_arg(ap, unsigned int);
            printf("%X", uval);
            break;
        case 'o':
            uval = va_arg(ap, unsigned int);
            printf("%o", uval);
            break;
        case 'p':
            pval = va_arg(ap, void *);
            printf("%p", pval);
            break;
        default:
            putchar(*p);
            break;
        }
    }
    va_end(ap); /* 終わったときクリーンアップ */
}

実行結果

$ ./minprintf
"hello" is string of s
         is \t
7a is %x of 'z'
7A is %X of 'z'
172 is %o of 'z'
0x100000eac is pointer of "hello"
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»