【问题标题】:What condition is causing this program to leave the for loop early due to a EOF character?由于 EOF 字符,什么情况导致该程序提前离开 for 循环?
【发布时间】:2012-10-31 16:08:08
【问题描述】:

继续查看本文底部的实际问题

我可能试图过多地理解真正简单的事情,但在弄清楚这一点之前我无法继续。

在阅读 K&R 1.9 字符数组时,您遇到了一个示例程序,该程序接受输入并确定哪一行最长,然后重新打印。

为了理解这个程序的getline函数,我稍微修改了一下,在它的执行过程中打印了一些信息。现在我发现了一些输入,一旦我理解了这些输入,应该会大大增强我对 getchar() 的理解。


附带说明,当我尝试从库中读取源代码时,我完全不知所措。例如,我尝试寻找 getchar() 并最终目瞪口呆地盯着 stddef.h 的第 300 行某处的 18 #endif 塔。我将通过在不久的将来停止对 stdio.h 中的功能的追求来避免这种头痛。图书馆很难找到东西是正常的吗?该函数不应该作为可读源存在,还是我只是抱有希望?


为了方便起见,我将继续从 K&R 发布整个修改后的程序:

#include <stdio.h>
#define MAXLINE 5   /* maximum input line length */

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/* print the longest input line */
main()
{
    int len;            /* current line length */
    int max;            /* maximum length seen so far */
    char line[MAXLINE];    /* current input line */
    char longest[MAXLINE]; /* longest line saved here */
    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0)  /* there was a line */
        printf("%s\n", longest);
        printf("INFO: max = %d\n", max);
        printf("INFO: sizeof s[] = %d", sizeof longest);
    return 0;
}

/* getline:  read a line into s, return length  */
int getline(char s[],int lim)
{
    int c, i;
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i){
        s[i] = c;
        printf("INFO: s[%d] = %c\n", i, c);
    if (c == '\n') {
        printf("INFO: %d\n", i);
        printf("INFO: s[%d] = \\n\n", i);
        s[i] = c;
        ++i;}
    }
    s[i] = '\0';
    return i;
}

/* copy:  copy ’from’ into ’to’; assume to is big enough */
void copy(char to[], char from[])
{
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

这是一些输入/输出示例:我正在使用 CodeBlocks 和 Windows 7

最后,我的问题是为什么 getline() 函数中的 for 循环在到达 F 后离开循环,因此将空终止符放在 F 之后作为 \0

我的假设是,也许将显示为^Z 的 EOF 字符放在 Windows 终端中,数组被截断为 4 个字符加上一个空终止符的长度。事实证明,如果我将 EOF 字符放在要读取的行中,则保存的行 s[] 将只包含最大大小为 5。同样让我感到困惑的是变量 len 将始终为 0,是因为len 是在 main() 的 while 循环期间分配的,并且一旦 while 循环中断,它的值就不会保存?

对我来说有趣但对于有经验的 C 用户可能不感兴趣的是,getline() 中 for 循环之后的 if 语句可以在 for 循环内部或外部,它不会改变程序。有趣,因为这不意味着无论 for 循环是否执行主体中的任何代码,至少 (c=getchar()) 都会被执行?

抱歉这个问题太罗嗦了,感谢任何有用的 cmets/answers。

【问题讨论】:

    标签: c codeblocks kernighan-and-ritchie


    【解决方案1】:

    因为MAXLINE 是5,而getline 函数读取的字符数永远不会超过MAXLINE - 1

    【讨论】:

    • 你先生,是一个快速调试器。
    • 如果答案在第二行,那很容易快速。
    • @Leonardo 您应该将此标记为答案,以便将其从未回答的问题中拉出来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多