開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: C
- Clang (コンパイラ)
プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第7章(入出力)、7.4(書式付き入力 - scanf)、演習7-4を解いてみる。
その他参考書籍
- プログラミング言語Cアンサー・ブック 第2版 (クロビス・L.トンド、スコット・E.ギンペル(著)、矢吹 道郎(翻訳))
演習 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 コメント:
コメントを投稿