2017-02-21 1 views
1

Я трудно понять, почему автор решил установитьwhile ((len = getline (line, MAXLINE))> 0) - зачем устанавливать> 0?

(len = getline(line, MAXLINE))>0 

Ниже приведен код из примера K & R 1-19.

#include <stdio.h> 
#define MAXLINE 1000 /* maximum input line size */ 

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

/* print 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)) > 0) 
       if (len > max) { 
         max = len; 
         copy(longest, line); 
       } 
     if (max > 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<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) 
       s[i] = c; 
     if (c == '\n') { 
       s[i] = c; 
       ++i; 
     } 
     s[i] = '\0'; 
     return i; 
} 

/* copy: copy 'from' into 'c'; assume to is big enough */ 
void copy(char to[], char from[]) 
{ 
     int i; 

     i = 0; 
     while ((to[i] = from[i]) != '\0') 
       ++i; 
} 

Мое понимание кода выглядит следующим образом:

  1. Функция GetLine вызывается.
  2. Функция getline запрашивает входные данные от пользователя.
  3. Если пользовательский ввод (-ы) не является EOF, возврат каретки и если общий пользовательский ввод не превышает 998, то значение ASCII первого символа сохраняется в s [1], значение второго символа сохраняется в s [2] и т. д. В течение этого времени одновременно для каждого введенного символа значение i увеличивается на 1.
  4. Если пользователь нарушает одно из этих трех условий, цикл прекращается.
  5. Менее чем lim-1 гарантирует, что в худшем случае значение 999-го значения равно ASCII возврата каретки, а нулевое значение вставляется в 1000-е значение.
  6. Функция getline выплескивает одно число, конечное значение i.
  7. Цикл будет работать до тех пор, как я есть> 0.

Мой вопрос: Удаление> 0 из

while ((len = getline(line, MAXLINE)) > 0) 

Не похоже, чтобы повлиять на исход кода. Он по-прежнему работает как обычно. Почему удаление> 0 не влияет на исход кода? И почему автор ставит> 0 в, если это не влияет на исход кода?

+1

Примечание: «Значение ASCII первого символа хранится in_' s [0] ', а не' s [1] 'как массивы в начале C на 0. –

+0

Извините, что вы правы. –

ответ

3

Почему удаление> 0 не влияет на исход кода?

Это потому, что getline() функция возвращает либо положительное целое число или 0 если случай EOF. Так заявление:

while ((len = getline(line, MAXLINE)) > 0) 

эквивалентно:

while ((len = getline(line, MAXLINE))) 

, который фактически проверяет состояние внутри while и оценивает его true или false. В while цикле, если у вас есть любое целое значение, для 0 за исключением, как условие, оно оценивается как true. Только 0 оценивается как false.

Таким образом, если пользователь сразу попадает EOF, количество прочитанных символов будет 0 и условие while цикла оценивается в false.Если вы удалите >0, это будет так же, как если бы вы этого не сделали. Цель добавления - объяснение причин.

См. this link о том, как такие условия, как эта работа.

+0

Спасибо за ваш ответ Я понимаю, что getline() возвращает количество прочитанных символов, но если пользователь сразу вводит EOF, количество прочитанных символов будет равно нулю. По моему мнению, если вы удалите часть «> 0», это должно вызвать программу для запуска в бесконечном цикле, но программа не работает. Вместо этого она работает как обычно. Почему это так? И если она работает как обычно, для чего нужна добавка> 0? –

+0

@ sp2danny Это 'getline 'реализация никогда не может вернуться -1! –

+0

@JohnDoe см. мой отредактированный пост. Теперь ясно? – Marievi

0

Пока условие истинно, если len не равно нулю. В противном случае он выйдет из строя.

0

Поскольку эта конкретная реализация getline возвращает 0 в конец файла и возвращает значение (строго) больше 0 в любом другом случае.

И в логическом контексте (в тестовом или петлевой состоянии), любое значение INT верно, кроме 0.

Так как:

while ((len = getline(line, MAXLINE)) > 0) 

и

while ((len = getline(line, MAXLINE)) /* same as while ((len = getline(line, MAXLINE) != 0) 

будет петлевой до конца файла.

Смежные вопросы