From 032b64e37a23541e136dcf082a4564023579ed39 Mon Sep 17 00:00:00 2001 From: Isa Hassen Date: Fri, 18 Dec 2015 19:40:12 -0500 Subject: Re-solve Exercise 1-16: arbitrarily long maxline A completely rewritten solution which follows the spec given in the book exactly; make the program work for arbitrarily long input lines while modifying `main()` only. I've only changed the name of the macro MAXLINE to BUFFSIZE for clarity - otherwise the code is typed up exactly as found in the book. It demonstrates the use of a buffer without modifying any of the helper functions. --- ch1/1-16_longest-line.c | 104 ++++++++++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 44 deletions(-) (limited to 'ch1') diff --git a/ch1/1-16_longest-line.c b/ch1/1-16_longest-line.c index 137bb11..450d990 100644 --- a/ch1/1-16_longest-line.c +++ b/ch1/1-16_longest-line.c @@ -9,55 +9,71 @@ * Answer: The key to arbitrary limits is buffering. Using a buffer allows you * to tackle a problem in chunks of memory instead of all at once. It's * slightly more complicated, but adds usefulness to a program. + * + * This solution, which was contributed by Isa (ibnIrshad), follows the spec + * exactly, by only modifying main(), unlike many other solutions on the + * internet. + * + * Assumptions: + * 1. "arbitrarily long" is interpreted to mean upto the maximum size of an + * integer on the given architechture, e.g. 2^32 unsigned on a 32-bit machine. + * Indeed a string of that size would be larger than 4 gigabytes. + * It is possible to deal with numbers larger than that, but it involves a great + * deal of work abstracting away the concept of an integer, similar to + * dynamically sized arrays. + * + * 2. EOF signal (Ctrl-D) must be given on an empty line */ +#define BUFFSIZE 5 /* renamed MAXLINE and reduced it to 5 to demonstrate +we can handle lines much greater than this number*/ + +int getlinelen(char line[], int maxline); +void copy(char to[], char from[]); + +/* print longest input line */ +main() +{ + /* len of current line, max len seen so far, templen of buffer */ + int len, max, templen; + char buffer[BUFFSIZE]; -#define MAXLENGTH 100 - -int get_line(char s[], int lim) { - /* Put as much as possible into a temp string, and count its length */ - int c, i; - - for (i = 0; i < lim && (c = getchar()) != EOF && c != '\n'; ++i) { - s[i] = c; - } - if (c == '\n') { - s[i] = c; - ++i; - } - s[i] = '\0'; - return i; + max = len = 0; + + while ((templen = getlinelen(buffer, BUFFSIZE)) > 0) { + len += templen; + + if (buffer[templen-1] == '\n'){ + if (len > max) + max = len; + len = 0; + } + } + printf("\nLen of longest line: %d\n", max); + return 0; } -void copy(char from[], char to[]) { - int i = 0; +/* getlinelen: read a line into s, return length */ +int getlinelen(char s[], int lim) +{ + int c, i; - while ((to[i] = from[i]) != '\0') { - ++i; - } + for (i=0; i 0) { - if (len > max) { - max = len; - copy(line, longest); - } - } - - printf("\nThe longest line is %3d characters long.\n", max); - printf("----------------------------------------\n"); - if (max > 0) { - printf("%-s", longest); - if (max == MAXLENGTH && longest[max - 1] != '\n') { - printf("\n"); - } - } - - return 0; + +/* copy: copy 'from into 'to'; assume to is big enough */ +void copy(char to[], char from[]) +{ + int i; + + i = 0; + while ((to[i] = from[i]) != '\0') + ++i; } -- cgit v1.2.3-54-g00ecf an class='insertions'>+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