K& R第1.9节

时间:2016-07-13 15:33:30

标签: c eof

我正在研究Ritchie's和Kernighan的C编程语言,我不明白以下代码是如何工作的:

#include <stdio.h>
#define MAXLINE 1000

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

int 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);
}

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;
    }
    s[i] = '\0';
    return(i);
}

void copy(char to[], char from[])
{
    int i;

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

代码ABOVE getline()函数返回i的值

并且main中的while循环运行直到时间getline返回i的正值。

那么在getline()函数中遇到EOF时,while循环如何终止?

3 个答案:

答案 0 :(得分:0)

while循环在条件为false时终止(一旦遇到EOF,所有其他getchar请求也返回EOF)

答案 1 :(得分:0)

让我们看一下getline()函数。

我们有 for 循环,它将i初始化为0.然后,检查条件。其中一个条件是(c = getchar())!=EOF

因此,如果插入了EOF,则不会执行for body。

如果EOF是第一个插入的字符,则i仍为0,因此getline()函数返回0.

如果EOF不是第一个插入的字符,则代码会继续运行并且不会在主要字符中结束循环,因为i变为&gt; 0

main()中对时间的检查是while((len = getline(line, MAXLINE)) > 0),因此返回值严格&gt; 0

if (0 > 0) printf("true"); else printf("false");在C中打印false(以及我所知道的每种语言)。

因此,身体不会被执行,并且循环结束。

答案 2 :(得分:0)

简单地说:

如果遇到EOF,则getline会将其读取的内容返回EOF

getline()的任何下一次调用中,它再次读取EOF,因此将返回零。