aboutsummaryrefslogtreecommitdiff
path: root/ch7/7-03_minprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'ch7/7-03_minprintf.c')
-rw-r--r--ch7/7-03_minprintf.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/ch7/7-03_minprintf.c b/ch7/7-03_minprintf.c
new file mode 100644
index 0000000..92cbde1
--- /dev/null
+++ b/ch7/7-03_minprintf.c
@@ -0,0 +1,75 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+/* The C Programming Language: 2nd Edition
+ *
+ * Exercise 7-3: Revise `minprintf` to handle more of the other facilities
+ * of `printf`.
+ *
+ * Notes: It doesn't specify *which* facilities, or how many, so we'll choose
+ * three:
+ *
+ * o - octal
+ * x - hexadecimal
+ * c - unsigned char
+ *
+ * Since we're passing to printf(), this was easy. Doing it ourselves would
+ * take some more work. But we'll skirt by with the minimum.
+ */
+
+void minprintf(char *fmt, ...) {
+ va_list ap;
+ char *p, *sval;
+ int ival;
+ double dval;
+ va_start(ap, fmt);
+ 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':
+ ival = va_arg(ap, int);
+ printf("0x");
+ printf("%x", ival);
+ break;
+ case 'o':
+ ival = va_arg(ap, int);
+ printf("0o");
+ printf("%o", ival);
+ break;
+ default:
+ putchar(*p);
+ break;
+ }
+ }
+ va_end(ap);
+}
+
+int main(int argc, char *argv[]) {
+ /* Should output 0o144 */
+ minprintf("100 = %o\n", 100);
+ /* Should output 0x64 */
+ minprintf("100 = %x\n", 100);
+ /* Should output a semicolon */
+ minprintf("char(0x59) = %c\n", 59);
+ return 0;
+}
lass='deletions'>-38/+46 2018-10-06cli: change "Status" heading to "Progress"zlg2-36/+40 2018-09-29Bump to 0.3alpha5 for PyPIzlg1-1/+1 2018-09-29cli: Add pretty printing to 'list' commandzlg3-17/+107 2018-09-08setup.py: Bump to alpha4 for PyPIzlg1-1/+1 2018-09-08cli: add '--raw' option to list commandzlg2-9/+45 2018-09-08Add remaining filters to vgstash packagezlg1-2/+11 2018-09-04Update LICENSE to match setup.pyzlg1-80/+67 2018-09-03Branch off from master with pytest, tox, clickzlg16-778/+779 2018-03-18Flesh out filter types and ownership statuszlg3-82/+144 2018-03-18README.mdown: break line correctlyzlg1-1/+1 2018-03-18add 'playlog' list filterzlg2-2/+9 2018-03-13Update helpers a bitzlg1-2/+9 2018-03-13Make VGSTASH_DB_LOCATION point to a filezlg2-21/+20 2016-11-18Remove settings from helpers.shZe Libertine Gamer1-5/+0 2016-11-15Correct phrasing in README.Ze Libertine Gamer1-4/+4 2016-11-13DerpZe Libertine Gamer1-0/+1 2016-11-03Improve error handling in shell scriptsZe Libertine Gamer4-3/+23 2016-10-24Correct run_again, add recursionZe Libertine Gamer1-0/+4 2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1 2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101 2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9 2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5