【问题标题】:K&R section 1.9K&R 第 1.9 节
【发布时间】: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 循环如何终止呢?

【问题讨论】:

  • 注意条件是&gt; 0i 可能是== 0,那是循环中断的时候...
  • getline() 有一个弱点。 if (c == '\n') { s[i] = c; } 有什么意义,下一行 s[i] = '\0'; 覆盖 s[i]。顺便说一句,不要只替换为s[i++] = c;,这会产生另一个问题(潜在的缓冲区溢出)

标签: c eof


【解决方案1】:

简单地说:

如果遇到EOF,则getline 返回它读取到EOF 的任何内容。

getline() 的任何下一次调用中,它会再次读取EOF,因此将返回零。

【讨论】:

  • 所以当遇到第一个 EOF 时返回当前字符串。并执行while循环。在下一次迭代中,由于 EOF 发生较早,C 的当前值再次为 EOF 并且 getline() 返回 0,这是正确的吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    让我们看看getline() 函数。

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

    因此,如果插入 EOF,则不会执行 for 正文。

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

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

    main()中的while检查是while((len = getline(line, MAXLINE)) &gt; 0),所以while返回值严格> 0。

    if (0 &gt; 0) printf("true"); else printf("false"); 用 C(以及我知道的所有语言)打印 false

    因此while主体没有被执行,循环结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 2011-10-11
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多