K&R 1.9节
我通过里奇的和Kernighan的的C编程语言的工作,我不明白下面的代码是如何工作的:K&R 1.9节
#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;
}
在上面的代码 ,则对getline()函数返回的值我
和主循环运行,直到时间getline返回一个正值i。
那么在getline()函数中遇到EOF时while循环如何终止?
简单地说:
如果EOF
遇到,然后getline
回报不管它已读到了EOF
。
在getline()
的任何下次调用中,它会再次读取EOF
,因此将返回零。
因此当遇到第一个EOF时返回当前字符串。 while while循环被执行。在EOF发生之前的下一次迭代中,C的当前值再次是EOF,getline()返回0,这是否正确? –
是的,这是正确的。 –
while循环终止的条件是假的(EOF后已经遇到的所有进一步的getchar请求也返回EOF)
让我们来看看getline()
功能。
我们有一个为周期,它将i
初始化为0.然后检查一个条件。 3个条件之一是(c = getchar())!=EOF
。
因此,如果插入EOF,则不会执行for体。
如果EOF
已经率先插入字符时,i
仍然0
,所以getline()
函数返回0
如果EOF
不是第一个插入的字符,代码继续运行,并没有结束主因为i
周期成为> 0
在main()
上,而该检查是while((len = getline(line, MAXLINE)) > 0)
,所以当返回值是严格> 0
if (0 > 0) printf("true"); else printf("false");
在C中打印出false
(以及我知道的每种语言)。
因此,while body不被执行,并且循环结束。
请注意,条件是'> 0'和'i'可能是'== 0',这就是当循环结束时... –
'getline()'有一个弱点。 'if(c =='\ n')是什么意思?s [i] = c; }'?,下一行's [i] ='\ 0';'覆盖'[i]'。顺便说一句,不要只用's [i ++] = c;'替换,这会导致另一个问题(潜在的缓冲区溢出) – chux