diff --git a/KNR C/ex1_16.c b/KNR C/ex1_16.c new file mode 100644 index 0000000..19cea6a --- /dev/null +++ b/KNR C/ex1_16.c @@ -0,0 +1,71 @@ +#include + +/*A program for finding the longest line in its input, and then returning the + * longest. Primarily copied from page 30 of KNR C by Kernigham Ritchie. + * Annotation is extremely verbose so that I could break this code down for + * myself in a way that made more sense than as-written.*/ + +#define MAXLINE 1000 //Define maximum allowable line length. + +//Forward declaration for a function that will retreive the current line and +//store it in array line[]. Since modern C actually has a getline function, we +//declare this as pullline +int pullLine(char line[], int maxline); +//Forward declaration for a function to copy between arrays. +void copy(char from[], char to[]); + +int main(){ + + //Declare ints related to tracking line lengths. + int currentLength; //Length of current line; originally len. + int max = 0; //Length of longest line encountered; originally max. + //Initialized as 0 as opposed to using a separate + //statement to set value as in original code. + + char line[MAXLINE]; //Initialize array for storing current line. + char longest [MAXLINE]; //Initialize array for storing longest line so far. + + while ((currentLength = pullLine(line, MAXLINE)) > 0){ + if (currentLength > max){ + max = currentLength; + copy(line, longest); + } + } + if (max > 0) //If any lines were encountered, print the longest. + printf("%s", longest); + return 0; +} + +//pullLine will read a line into array s[] and return its length. +int pullLine(char s[], int lim){ + int c, i; + /*Set i= 0, check if i is < lim, which is MAXLINE as written AND that + * getchar returns a non EOF character (while stepping c) AND that the + * character pulled (c), is not a newline character, then increment i. The + * actual body of this loop simply stores the value of the retrieved + * character in array s[] at position |i|.*/ + for (i = 0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) + s[i] = c; + + if (c == '\n'){ //If |c| is \n, then still set pos \i\ in array s[] and + //increment i. This has to be handled outside the for loop, + //since c =='\n' is a break condition. + s[i] = c; + ++i; + } + s[i] = '\0'; //Set a null value at the end of the line for termination. + return i; //Return the length of the line pulled. +} + +//Function for copying one array to another. I chose to write this as +//from -- > to instead of to --> from because it's not the 90s any more and +//I feel like I'm allowed to have a little temporal linearity as a treat. +void copy(char from[], char to[]){ + int i = 0; //I have once again initialized and declared in the same line + //because it is 2025. + + //Set the value of pos \i\ in to[] to the value of pos \i\ in from as long + //as it is not null. + while ((to[i] = from[i]) != '\0') + ++i; +}