2013年8月30日金曜日

開発環境

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

その他参考書籍

演習 7-3.

コード

sample.c

#include <stdio.h>

int main(int argc, char *argv[])
{
    void minprintf(char *, ...);
    
    minprintf("%10d %i %o %x %X %u %c\n",
        2, -3, 4, 5, 6, 7, 8);
    minprintf("%f %e %E %g %G\n",
        1.2, 2.3, 3.4, 4.5, 5.6);
    minprintf("%10s\n", "python");
    minprintf("%%%%\n");
    return 0;
}

#include <stdarg.h>
#include <ctype.h>

#define MAXFMT 1000

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

入出力結果(Terminal)

$ ./a.out
         2 -3 4 5 6 7 
1.200000 2.300000e+00 3.400000E+00 4.5 5.6
    python
%%
$

0 コメント:

コメントを投稿