71 lines
2.7 KiB
C
71 lines
2.7 KiB
C
#include <stdio.h>
|
|
|
|
/*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;
|
|
}
|