diff options
author | zlg <zlg@zlg.space> | 2015-12-19 18:40:02 -0800 |
---|---|---|
committer | zlg <zlg@zlg.space> | 2015-12-19 18:40:02 -0800 |
commit | 0c7a59180de778a4e9019176a65eb02b5493b6f7 (patch) | |
tree | 967bf532cf9cc9ed2d0416257b8102dcd29aaded | |
parent | Change license to GPLv3, add contributing guide (diff) | |
download | knr-0c7a59180de778a4e9019176a65eb02b5493b6f7.tar.gz knr-0c7a59180de778a4e9019176a65eb02b5493b6f7.tar.bz2 knr-0c7a59180de778a4e9019176a65eb02b5493b6f7.tar.xz knr-0c7a59180de778a4e9019176a65eb02b5493b6f7.zip |
1-16 solution code and comment style cleanup
Also of note is the length that the program reports includes the newline
character at the end. This has been clarified in a comment. The exercise
text does not specify whether to include newlines as part of the length,
so it was left alone.
Removed the contributor notice, since contributor acknowledgements are
centralized.
Diffstat (limited to '')
-rw-r--r-- | ch1/1-16_longest-line.c | 92 | ||||
-rw-r--r-- | ch5/5-01_getint-fixed.c | 7 |
2 files changed, 51 insertions, 48 deletions
diff --git a/ch1/1-16_longest-line.c b/ch1/1-16_longest-line.c index 450d990..3c86570 100644 --- a/ch1/1-16_longest-line.c +++ b/ch1/1-16_longest-line.c @@ -10,70 +10,66 @@ * 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. + * This solution 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. + * 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*/ + +/* demonstrate that we can handle lines much greater than this number*/ +#define BUFFSIZE 5 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; +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; + } + } + /* The length returned includes the '\n' character. */ + 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<lim-1 && (c=getchar()) != EOF && c!='\n'; ++i) - s[i] = c; - if (c == '\n') { - s[i] = c; - ++i; - } - s[i] = '\0'; - return i; +int getlinelen(char s[], int lim) { + int c, i; + for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) { + s[i] = c; + } + if (c == '\n') { + s[i] = c; + ++i; + } + s[i] = '\0'; + return i; } -/* 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; +/* 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; + } } diff --git a/ch5/5-01_getint-fixed.c b/ch5/5-01_getint-fixed.c index 8d53ba6..b013f20 100644 --- a/ch5/5-01_getint-fixed.c +++ b/ch5/5-01_getint-fixed.c @@ -23,6 +23,7 @@ int main() { while (getint(bar) > 0) { printf("%d\n", foo); } + printf("Contents of buffer:%s\n", buf); return 0; } @@ -38,8 +39,14 @@ int getint(int *pn) { sign = (c == '-') ? -1 : 1; if (c == '+' || c == '-') { c = getch(); + if (!isdigit(c)) { + ungetch(c); + ungetch(sign == 1 ? '+' : '-'); + return 0; + } } if (!isdigit(c)) { + ungetch(c); return 0; } for (*pn = 0; isdigit(c); c = getch()) { |