Answer to Exercise 1-17, "The C Programming Language", 2nd edition, Kernighan and Ritchie
I found Answer to Exercise 1-17 of TCPL2 at this link. And for fun, I wrote mine. Here is my answer.
/** Answer to exercise 1-17, "The C Programming Language", 2nd edition
* Write a program to print all input lines that are longer than 80 characters.
*
* Story: I was thinking, what if requested input line length is not
* 80 characters, what if there is some limitation on the machine that array
* line[]'s max length is limited, and requested line length is longer than
* array maximumal-limited length. So in order to make the program more
* flexible, I give it a shot to hack it.
* Desc: The answer is based on TCPL2 example 1-9, using its getline() and
* copy() routines to achieve it. Technically, character include
* invisible character like '\n', etc. So I didn't limit my program
* to general character 'a'-'z', etc.
* Author: Dooit Lee <dooit.lee@gmail.com>
* Date: Feb 23, 2012
*/
#include <stdio.h>
#define MAXLINE 10 /* maximum input line length */
#define LINELEN 80 /* print out line length */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line*/
main()
{
int len; /* current line length */
char line[MAXLINE]; /* current input line */
char strstack[(LINELEN/(MAXLINE-1)) + 1][MAXLINE] = { 0 };
int c, lenstat; /* lenstat is for line length statistic */
int stackindex, i;
lenstat = stackindex = 0;
while ((len = getline(line, MAXLINE)) > 0) {
/* getline() not finish reading a line yet */
if (len == MAXLINE - 1 &&
line[len-1] != '\n' &&
(c = getchar()) != EOF) {
ungetc(c, stdin); /* put back character c to stdin */
if (lenstat > LINELEN) {
printf("%s", line);
} else {
copy(strstack[stackindex++
% ((LINELEN/(MAXLINE-1))+1)],
line);
if (stackindex * (MAXLINE-1) > LINELEN) {
for (i = 0; i < stackindex; i++) {
printf("%s", strstack[i]);
}
stackindex = 0;
}
}
lenstat += len;
continue; /* continue to read current unfinished line */
} else {
lenstat += len;
if (lenstat > LINELEN) {
if (stackindex != 0) {
for (i = 0; i < stackindex; i++)
printf("%s", strstack[i]);
stackindex = 0;
}
if (line[len-1] == '\n')
line[len-1] = '\0';
printf("%s", line);
printf(": %d\n", lenstat);
}
lenstat = 0;
stackindex = 0;
}
}
}
/* getline: read a line into s, return length */
int getline(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[])
{
while ((*to++ = *from++) != '\0')
;
}