title: Understanding the program that reads a set of text lines and prints the longest in K &R's book
body: <p>I'm reading K &amp;R's book, section 1.9. The program for printing the longest line, from a given set of lines, is given as</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #define MAXLINE 1000                   /* maximum input 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 */
     int max;                               /* maximum length seen so far */
     char line[MAXLINE];                    /* current input line */
     char longest[MAXLINE];                 /* longest line saved here */
     max = 0;
     while ((len = getline(line, MAXLINE)) &gt; 0)
        if (len &gt; max) {
           max = len;
           copy(longest, line);
        }
     if (max &gt; 0) /* there was a line */
        printf("%s", longest);
     return 0;
  }
  
  /* getline: read a line into s, return length */
  
  int getline(char s[], int lim)
  {
     int c, i;
     for (i=0; i &lt; lim-1 &amp;&amp; (c=getchar())!=EOF &amp;&amp; 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;
  }
  </code></pre>
  
  <p>There is a problem in the <code>getline</code> function. If the <code>lim-1</code>th character of input line is not a newline then the <code>getline</code> will insert <code>'\0'</code> at <code>lim-1</code>th place leaving the <code>lim</code>th place unused (or empty).  </p>
  
  <p>I've removed this limitation by modifying the <code>getline</code> as,</p>
  
  <pre><code>int getline(char s[], int lim)
  {
     int c, i;
     for (i=0; i &lt; lim-1 &amp;&amp; (c=getchar())!=EOF &amp;&amp; c!='\n'; ++i)
        s[i] = c;
     s[i] = c;
     s[i+1] = '\0';
     return i;
  }
  </code></pre>
  
  <p>Is my version of <code>getline</code> correct?  </p>
  
  <p>If so, which version is fastest at run time, requires least memory, and uses least memory?</p>