#include /* The C Programming Language: 2nd Edition * * Exercise 1-16: Revise the main routine of the longest-line program so it * will correctly print the length of arbitrarily long input lines, and as * much as possible of the text. * * 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]; 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; } /* getlinelen: read a line into s, return length */ int getlinelen(char s[], int lim) { int c, i; for (i=0; i