由于EOF字符,导致此程序提前离开for循环的条件是什么?

时间:2012-11-12 08:15:06

标签: c codeblocks kernighan-and-ritchie

继续并查看本帖子底部的实际问题

我可能试图理解那些非常简单的事情,但是直到我想出来之后我才能继续。

在阅读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

sampleIO

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

我的假设是,可能将EOF字符显示为^Z在windows终端中,数组被截断为4个字符的长度加上一个空终止符。事实证明,如果我将EOF字符放在要读取的行中,则保存的行s[]将只包含最大大小为5.还有什么让我感到困惑的是变量len将始终为0是因为len是在main()的while循环中分配的,并且在while循环被破坏时没有保存它的值?

对我来说很有意思,但可能没有经验的C用户,是getline()中for循环之后的if语句可以在for循环内部,也可以在外部,并且它不会更改程序。有意思,因为这并不意味着for循环是否执行正文中的任何代码,至少(c = getchar())是否被执行?

对不起,这个问题很刻薄,我感谢任何有用的评论/答案。

1 个答案:

答案 0 :(得分:6)

因为MAXLINE为5,getline函数的读取次数绝不会超过MAXLINE - 1