Niepoprawny warunek pętli for dla nowej linii tekstu

0

Witam, mam problem z następującym funkcją pobierającą wpisywany wiersz:

 
/* 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) /*TEN FRAGMENT*/
        s[i] = c;
    if (c == '\n') { /*TEN FRAGMENT*/
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
    }
 

Zaznaczyłem dyskusyjny fragment, przykład pochodzi z książki ANSI C K&R.
Wydaje mi się nielogiczne, żeby najpierw w pętli for testować czy c != '\n' po czym robić osobny warunek na przypadek c =='\n' i dokonywać tej samej operacji co ta wyżej w pętli for.
Czy mam rację?
Jeśli nie, to czemu ten przypadek jest w taki sposób oddzielony?
Z góry dziękuję za pomoc

0
for (i=0; i<lim-1 && (c=getchar())!= EOF && c!='\n'; ++i)
    s[i] = c;
// KONIEC petli for
if (c == '\n') { // tu sprawdzamy, czy warunkiem stopu petli nie byl znak '\n' [*]
    s[i] = c;
    ++i;
}

Pętla może zakończyć się na 3 sposoby:

  1. Zapełniono całą tablicę s
  2. Skończono wczytywanie całego pliku
  3. Wczytano znak nowej linii
    Jeśli wczytano przejście do nowej linii, to ten znak jest dopisywany do tablicy.

Zauważ, że warunkiem wykonania iteracji jest i < lim-1 && (c = getchar()) != EOF && c != '\n'. Wobec tego warunkiem stopu jest i >= lim || c == EOF || c == '\n'. W ifie na końcu sprawdzane jest, czy był to przypadek c == '\n'.

1 użytkowników online, w tym zalogowanych: 0, gości: 1