我正在研究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循环如何终止?
答案 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
,因此将返回零。