while((len = getline(line,MAXLINE))> 0) - 为什么设置> 0?

时间:2017-02-21 08:58:16

标签: c

我很难理解作者为何选择

(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]中,第二个字符的ASCII值存储在s [1]中字符的值存储在s [2]中,依此类推。在此期间,对于输入的每个字符,i的值增加1。
  4. 如果用户中断了这三个条件之一,则循环终止。
  5. 小于lim-1确保在更糟糕的情况下,第999个值是回车的ASCII,并且空值被插入第1000个值。
  6. getline函数吐出一个数字,即i的最终值。
  7. 只要我是&gt;循环就会运行。 0
  8. 我的问题:删除&gt;

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

    似乎不会影响代码的结果。它仍然正常运作。 为什么删除&gt; 0不会影响代码的结果?如果不影响代码的结果,为什么作者将&gt; 0放入?

3 个答案:

答案 0 :(得分:3)

  

为什么删除&gt; 0不会影响代码的结果?

这是因为getline()函数返回正整数或0,如果是EOF的情况。所以声明:

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

相当于:

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

实际检查while中的条件并将其评估为truefalse。在while循环中,如果您有 0 之外的任何整数值作为条件,则 是评估为true 。只有0被评估为false

因此,如果用户立即输入EOF,则读取的字符数将为0,而while循环条件将评估为false。如果您删除>0,则与您不同时相同。添加它的目的是为了澄清原因。

请参阅this link了解此类条件的工作原理。

答案 1 :(得分:0)

如果len不为零,则条件为真。 否则它将退出循环。

答案 2 :(得分:0)

因为getline的这个特定实现在文件末尾返回0并且在任何其他情况下返回大于0的值(严格地)。

在布尔上下文中(在测试或循环条件中),任何int值都为true,除了0。

所以两者:

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

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

将循环直到文件结束。