From 3aa9b1189dc7ee6660a2b7123ee9a00df0f9ca09 Mon Sep 17 00:00:00 2001 From: zlg Date: Thu, 30 Jun 2016 03:56:52 -0700 Subject: Solve Exercise 7-4: minscanf() This one wasn't too bad, either! There's a minor bug in the code, but I'm not sure how to fix it. It *technically* meets muster, though. :P --- ch7/7-04_minscanf.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 ch7/7-04_minscanf.c (limited to 'ch7') diff --git a/ch7/7-04_minscanf.c b/ch7/7-04_minscanf.c new file mode 100644 index 0000000..d9803f6 --- /dev/null +++ b/ch7/7-04_minscanf.c @@ -0,0 +1,70 @@ +#include +#include + +/* The C Programming Language, 2nd Edition + * + * Exercise 7-4: Write a private version of `scanf` analagous to minprintf + * from the previous section. + * + * Notes: Again, it doesn't specify which facilities, so we'll choose a few + * of the more important ones: + * + * d - decimal number + * s - string + * f - floating point number + * + * Then pass things off to scanf(). + */ + +void minscanf(char *fmt, ...) { + va_list ap; + char *p, *sval, *rval; + int *ival; + float *fval; + va_start(ap, fmt); + for (p = fmt; *p; p++) { + if (*p != '%') { + putchar(*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: + putchar(*p); + break; + } + } + va_end(ap); +} + +int main(int argc, char *argv[]) { + printf("Enter a floating point number: "); + float foo; + minscanf("%f", &foo); + printf("We got a %f...\n", foo); + printf("Okay, and a regular number: "); + int bar; + minscanf("%d", &bar); + printf("And you gave me %d\n...", bar); + /* Interestingly, if your integer has a floating-point portion, + * it becomes the first string of minscanf()'s next call. + * This is peculiar and I'm not sure how to fix it. + */ + printf("Lastly, your first and last name, please: "); + char baz[80]; + char biz[80]; + minscanf("%s %s", &baz, &biz); + printf("Nice to meetcha, %s %s!\n", &*baz, &*biz); + return 0; +} -- cgit v1.2.3-70-g09d2 d>2020-03-08helpers.sh: Add vgub, vgmulti, vgrandzlg1-0/+29 2020-03-02Avoid a backtrace when editing notes on an invalid gamezlg2-1/+24 2020-03-02Avoid a backtrace when updating an invalid gamezlg2-4/+8 2019-04-30Release version 0.3 beta 4zlg4-42/+100 2019-04-29README.md: Clarify a few detailszlg1-4/+2 2019-04-29setup.py: Remove obsolete informationzlg1-1/+0 2019-01-03vgstash: Add "notes" filter to schemazlg1-1/+2 2018-11-21Prepare for distributionzlg2-1/+3 2018-10-22vgstash: let backlog filter ignore unbeatable gameszlg1-1/+1 2018-10-18Bump to 0.3beta2 for PyPIzlg1-3/+3 2018-10-18vgstash.DB.__init__: fix error output formattingzlg1-1/+1 2018-10-18README: fix inline <code> formattingzlg1-3/+4 2018-10-18cli: show msg if game to be deleted is not in DBzlg2-2/+12 2018-10-18README: expand on usage, cover shell quotingzlg1-7/+99 2018-10-18cli: Tell the user when a game lacks noteszlg2-3/+15 2018-10-18Catch when an invalid list filter is passedzlg4-3/+24 2018-10-12cli: Add zero-game import/export messageszlg2-11/+18 2018-10-10Bump to 0.3beta1 for PyPIzlg1-1/+1 2018-10-10Move tests and data to dedicated directoryzlg7-10/+26 2018-10-10cli: Add "export" commandzlg2-5/+54 2018-10-10cli: Add "import" commandzlg5-1/+76 2018-10-09Bump to 0.3alpha6 for PyPIzlg1-1/+1 2018-10-09cli: Add "notes" commandzlg2-4/+74 2018-10-09update_game: ensure notes are also savedzlg1-2/+2 2018-10-09cli: add 'update' commandzlg3-20/+92 2018-10-06cli: Add "delete" commandzlg2-0/+19 2018-10-06Remove ID field from DBzlg3-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