【发布时间】:2016-07-13 15:33:30
【问题描述】:
我正在研究 Ritchie 和 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;
}
在上面的代码中 getline() 函数返回 i 的值
main 中的 while 循环一直运行,直到 getline 返回 i 的正值。
那么当 getline() 函数中遇到 EOF 时,while 循环如何终止呢?
【问题讨论】:
-
注意条件是
> 0和i可能是== 0,那是循环中断的时候... -
getline()有一个弱点。if (c == '\n') { s[i] = c; }有什么意义,下一行s[i] = '\0';覆盖s[i]。顺便说一句,不要只替换为s[i++] = c;,这会产生另一个问题(潜在的缓冲区溢出)