《The C Programming Language》第一章1.9节字符数组示例程序的一个小疑点

《The C Programming Language》第一章1.9节字符数组示例程序的一个小问题
#include<stdio.h>
#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/*打印输入最长的行*/
main()
{
  int len;/*当前行长度*/
  int max;/*目前发现的最长行的长度*/
  char line[MAXLINE];/*当前的输入行*/
  char longest[MAXLINE];/*用于保存最长的行*/
   
  max = 0;
   
  while((len = getline(line,MAXLINE)) > 0)
  if(len > max)
  {
  max = len;
  copy(longest, line);
  }
  if(max > 0) /*存在这样的行*/
  printf("%s", longest);
   
  return 0;
}

/*getline函数:将一行读入到s并返回其长度*/
int getline(char s[],int lim)/*这里s的长度是由相应的实参数组决定的*/
{
  int c,i;
   
  for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)/*这里只能是i<lim-1,因为要考虑到存放'\n'*/
  s[i] = c;
  if(c == '\n')
  {
  s[i] = c;
  ++i;
  }
  s[i] = '\0';
  return i;
}

/*copy函数,将from复制到to,这里假定to足够大*/
void copy(char to[], char from[])
{
  int i;
   
  i = 0;
  while((to[i] = from[i]) != '\0')
  ++i;
}
请问程序中标红的i < lim -1是否有问题?我认为在数组末尾应该留出两个字符位置,一个给'\n',另一个给'\0',所以我认为应该是i < lim -2。不知哪位大虾能解释一下?

------解决方案--------------------
C/C++ code

//书上是对的,因为不需要预留两个位置
//条件语句i <lim-1 && (c=getchar())!=EOF && c!='\n'当是i < lim - 1不符合时,(c=getchar())!=EOF 和下
//面的if语句不会执行,当是c!='\n'不符合时,说明i <= lim - 2时,所以下面的空间也够的,返回值也正确

int getline(char s[],int lim)/*这里s的长度是由相应的实参数组决定的*/ 
{ 
    int c,i; 
    
    for(i=0; i <lim-1 && (c=getchar())!=EOF && c!='\n';++i)/*这里只能是i <lim-1,因为要考虑到存放'\n'*/ 
        s[i] = c; 
    if(c == '\n') 
    { 
        s[i] = c; 
        ++i; 
    } 
    s[i] = '\0'; 
    return i; 
}