2013年5月26日日曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第7章(入出力)、7.3(可変引数リスト)、演習7-3を解いてみる。

その他参考書籍

演習 7-3.

コード

sample.c

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

void minprintf(char *, ...);

int main()
{
    printf("d:%d, i:%i, o:%o, x:%x, X:%X, u:%u, c:%c, ",
        10, 10, 10, 20, 20, 10, 'c');
    printf("s:%s, f:%f, e:%e, E:%E, g:%g, G:%G, %%\n",
        "python", 1.2, 12345.67890, 12345.67890, 12345.67890, 1.234567890);
    minprintf("d:%d, i:%i, o:%o, x:%x, X:%X, u:%u, c:%c, ",
        10, 10, 10, 20, 20, 10, 'c');
    minprintf("s:%s, f:%f, e:%e, E:%E, g:%g, G:%G, %%\n",
        "python", 1.2, 12345.67890, 12345.67890, 12345.67890, 1.234567890);
    return 0;
}

void minprintf(char *fmt, ...)
{
    va_list ap;
    char *p, *sval;
    int ival, i;
    double dval;
    unsigned uval;
    char tmpfmt[1000], cval;
    
    va_start(ap, fmt);
    for (p = fmt; *p; p++) {
        if (*p != '%') {
            putchar(*p);
            continue;
        }
        i = 0;
        tmpfmt[i++] = '%';
        while (*(p+1) && !isalpha(*(p+1)))
            tmpfmt[i++] = *++p;
        tmpfmt[i++] = *(p+1);
        tmpfmt[i] = '\0';
        switch(*++p) {
            case 'd':
            case 'i':
                ival = va_arg(ap, int);
                printf(tmpfmt, ival);
                break;
            case 'o':
            case 'x':
            case 'X':
            case 'u':
                uval = va_arg(ap, unsigned);
                printf(tmpfmt, uval);
                break;
            case 'c':
                cval = va_arg(ap, char);
                printf(tmpfmt, cval);
                break;
            case 's':
                sval = va_arg(ap, char *);
                printf(tmpfmt, sval);
                break;
            case 'f':
            case 'e':
            case 'E':
            case 'g':
            case 'G':
                dval = va_arg(ap, double);
                printf(tmpfmt, dval);
                break;
            default:
                printf(tmpfmt);
                break;
        }
    }
    va_end(ap);
}

入出力結果(Terminal)

$ ./a.out
d:10, i:10, o:12, x:14, X:14, u:10, c:c, s:python, f:1.200000, e:1.234568e+04, E:1.234568E+04, g:12345.7, G:1.23457, %
d:10, i:10, o:12, x:14, X:14, u:10, c:c, s:python, f:1.200000, e:1.234568e+04, E:1.234568E+04, g:12345.7, G:1.23457, %
$

0 コメント:

コメントを投稿