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 将变为零。
我正在研究 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 将变为零。