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

演習7-4

minscanf の可変引数はポインタでなければならないので ival, fval はそれぞれ int, float へのポインタ変数とする。

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

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

int main(void)
{
    int day, year;
    char monthname[20];

    minscanf("%d %s %d", &day, monthname, &year);
    printf("day => %d, monthname => %s, year => %d\n", day, monthname, year);

    return 0;
}

/* minscanf : 可変な引数リストをもつ最小の scanf */
void minscanf(char *fmt, ...)
{
    va_list ap; /* 各名なし引数を順々に指す */
    char *p, *sval;
    int *ival;
    float *fval;

    va_start(ap, fmt); /* ap を最初の名なし引数を指すようにする */
    for (p = fmt; *p; p++) {
        if (*p != '%') {
            continue;
        }
        switch (*++p) {
        case 'd':
            ival = va_arg(ap, int *);
            scanf("%d", ival);
            break;
        case 'f':
            fval = va_arg(ap, float *);
            scanf("%f", fval);
            break;
        case 's':
            sval = va_arg(ap, char *);
            scanf("%s", sval);
            break;
        default:
            break;
        }
    }
}

実行結果

$ ./minscanf
25 Dec 2010
day => 25, monthname => Dec, year => 2010
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»