K&R 第 1.9 节

K&R section 1.9

我正在研究 Ritchie 和 Kernighan 的 The C programming language,但我不明白以下代码是如何工作的:

#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] = '[=10=]';
    return(i);
}

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

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

在上面的代码中 getline() 函数 returns i

的值

并且主程序中的 while 循环一直运行到 getline returns 的正值 i.

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

while 循环终止,因为条件为假(一旦遇到 EOF,所有进一步的 getchar 请求也 return EOF)

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

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

因此,如果插入 EOF,则不会执行 for 主体。

如果EOF是第一个插入的字符,i仍然是0,所以getline()函数returns 0.

如果 EOF 不是第一个插入的字符,代码将继续到 运行 并且不会结束主循环,因为 i 变为 > 0。

main() while 的检查是 while((len = getline(line, MAXLINE)) > 0),所以 while return 的值是 strictly > 0.

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

因此while主体不执行,循环结束。

简单地说:

如果遇到 EOF,则 getline return 读取到 EOF.

的任何内容

在下一次调用 getline() 时,它会再次读取 EOF,因此 return 将变为零。