開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: C
- Clang (コンパイラ)
プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第7章(入出力)、7.3(可変引数リスト)、演習7-3を解いてみる。
その他参考書籍
- プログラミング言語Cアンサー・ブック 第2版 (クロビス・L.トンド、スコット・E.ギンペル(著)、矢吹 道郎(翻訳))
演習 7-3.
コード
sample.c
#include <stdio.h> #include <stdarg.h> void minprintf(char *, ...); int main() { printf("d:%d, i:%i, o:%o, x:%x, X:%X, u:%u, c:%c, ", 10, 10, 10, 20, 20, 10, 'c'); printf("s:%s, f:%f, e:%e, E:%E, g:%g, G:%G, %%\n", "python", 1.2, 12345.67890, 12345.67890, 12345.67890, 1.234567890); minprintf("d:%d, i:%i, o:%o, x:%x, X:%X, u:%u, c:%c, ", 10, 10, 10, 20, 20, 10, 'c'); minprintf("s:%s, f:%f, e:%e, E:%E, g:%g, G:%G, %%\n", "python", 1.2, 12345.67890, 12345.67890, 12345.67890, 1.234567890); return 0; } void minprintf(char *fmt, ...) { va_list ap; char *p, *sval; int ival, i; double dval; unsigned uval; char tmpfmt[1000], cval; va_start(ap, fmt); for (p = fmt; *p; p++) { if (*p != '%') { putchar(*p); continue; } i = 0; 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); printf(tmpfmt, ival); break; case 'o': case 'x': case 'X': case 'u': uval = va_arg(ap, unsigned); printf(tmpfmt, uval); break; case 'c': cval = va_arg(ap, char); printf(tmpfmt, cval); break; case 's': sval = va_arg(ap, char *); printf(tmpfmt, sval); break; case 'f': case 'e': case 'E': case 'g': case 'G': dval = va_arg(ap, double); printf(tmpfmt, dval); break; default: printf(tmpfmt); break; } } va_end(ap); }
入出力結果(Terminal)
$ ./a.out d:10, i:10, o:12, x:14, X:14, u:10, c:c, s:python, f:1.200000, e:1.234568e+04, E:1.234568E+04, g:12345.7, G:1.23457, % d:10, i:10, o:12, x:14, X:14, u:10, c:c, s:python, f:1.200000, e:1.234568e+04, E:1.234568E+04, g:12345.7, G:1.23457, % $
0 コメント:
コメントを投稿