演習7-3 K&R プログラミング言語C
2010年03月08日
演習7-3
#include <stdio.h> #include <stdarg.h> void minprintf(char *fmt, ...); int main(void) { char *s = "hello"; minprintf("\"%s\" is string of s\n", s, s); minprintf("%c is \\t\n", '\t'); minprintf("%x is %%x of 'z'\n", 'z'); minprintf("%X is %%X of 'z'\n", 'z'); minprintf("%o is %%o of 'z'\n", 'z'); minprintf("%p is pointer of \"%s\"\n", s, s); return 0; } /* minprintf : 可変な引数リストをもつ最小の printf */ void minprintf(char *fmt, ...) { va_list ap; /* 各名なし引数を順々に指す */ char *p, *sval; int ival; unsigned int uval; double dval; void *pval; va_start(ap, fmt); /* ap を最初の名なし引数を指すようにする */ for (p = fmt; *p; p++) { if (*p != '%') { putchar(*p); continue; } switch (*++p) { case 'd': ival = va_arg(ap, int); printf("%d", ival); break; case 'f': dval = va_arg(ap, double); printf("%f", dval); break; case 's': for (sval = va_arg(ap, char *); *sval; sval++) { putchar(*sval); } break; case 'c': ival = va_arg(ap, int); printf("%c", ival); break; case 'x': uval = va_arg(ap, unsigned int); printf("%x", uval); break; case 'X': uval = va_arg(ap, unsigned int); printf("%X", uval); break; case 'o': uval = va_arg(ap, unsigned int); printf("%o", uval); break; case 'p': pval = va_arg(ap, void *); printf("%p", pval); break; default: putchar(*p); break; } } va_end(ap); /* 終わったときクリーンアップ */ }
実行結果
$ ./minprintf "hello" is string of s is \t 7a is %x of 'z' 7A is %X of 'z' 172 is %o of 'z' 0x100000eac is pointer of "hello"
プログラミング言語C 第2版 ANSI規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726