2013年8月31日土曜日

開発環境

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

その他参考書籍

演習 7-4.

コード

sample.c

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a, b;
    unsigned c, d, e, f;
    char s[1000];
    double g, h, i;
    void minscanf(char *, ...);
    
    minscanf("%d %i/%o %x %u %c/%s %e %f %g",
        &a, &b, &c, &d, &e, &f, s, &g, &h, &i);
    printf("%d %d\n%o %x %u %c\n%s\n%e%f%g\n",
        a, b, c, d, e, f, s, g, h, i);
    return 0;
}

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

#define MAXFMT 1000

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

入出力結果(Terminal)

$ ./a.out
-10 -20/3 4 5 a/python 1.2 2.3 3.4
-10 -20
3 4 5 a
python
5.271833e-3150.0000005.334e-315
$

0 コメント:

コメントを投稿