2013年5月27日月曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第7章(入出力)、7.4(書式付き入力 - scanf)、演習7-4を解いてみる。

その他参考書籍

演習 7-4.

コード

sample.c

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

void minscanf(char *, ...);

int main()
{
    int a, b, c, d, e;
    char ch, s[1000];
    double f, h;
    float g;
    minscanf("%d %i %o %u %x %c %s %e %f %g",
        &a, &b, &c, &d, &e, &ch, s, &f, &g, &h);
    printf("%d %i %o %u %x %c %s %e %f %g\n",
        a, b, c, d, e, ch, s, f, g, h);
    scanf("%d %i %o %u %x %c %s %e %f %g",
        &a, &b, &c, &d, &e, &ch, &s, &f, &g, &h);
    printf("%d %i %o %u %x %c %s %e %f %g\n",
        a, b, c, d, e, ch, s, f, g, h);
    
    return 0;
}

void minscanf(char *fmt, ...)
{
    va_list ap;
    char *p, *sval;
    int *ival, i;
    float *fval;
    double *dval;
    unsigned *uval;
    char tmpfmt[1000];
    
    va_start(ap, fmt);
    i = 0;
    for (p = fmt; *p; p++) {
        if (*p != '%') {
            tmpfmt[i] = *p;
            continue;
        }
        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 *);
                scanf(tmpfmt, ival);
                break;
            case 'o':
            case 'x':
            case 'X':
            case 'u':
                uval = va_arg(ap, unsigned *);
                scanf(tmpfmt, uval);
                break;
            case 'c':
            case 's':
                sval = va_arg(ap, char *);
                scanf(tmpfmt, sval);
                break;
            case 'f':
                fval = va_arg(ap, float *);
                scanf(tmpfmt, fval);
                break;
            case 'e':
            case 'E':
            case 'g':
            case 'G':
                dval = va_arg(ap, double *);
                scanf(tmpfmt, dval);
                break;
            default:
                scanf(tmpfmt);
                break;
        }
        i = 0;
    }
    va_end(ap);
}

入出力結果(Terminal)

$ ./a.out
10 10 10 10 10 cpython 12345.67890 1.2 12345.67890
10 10 10 10 10   cpython 5.823347e-315 1.200000 5.82335e-315
10 10 10 10 10   cpython 5.823347e-315 1.200000 5.82335e-315
$

0 コメント:

コメントを投稿