Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么情况导致该程序由于EOF字符而提前离开for循环?_C_Codeblocks_Kernighan And Ritchie - Fatal编程技术网

C 什么情况导致该程序由于EOF字符而提前离开for循环?

C 什么情况导致该程序由于EOF字符而提前离开for循环?,c,codeblocks,kernighan-and-ritchie,C,Codeblocks,Kernighan And Ritchie,继续往下看,看看这篇文章的底部,看看真正的问题 我可能试图去理解一些非常简单的事情,但是在我弄明白之前我无法继续 在阅读K&R 1.9字符数组时,您会遇到一个示例程序,该程序接受输入并确定哪一行最长,然后重新打印 为了理解这个程序的getline函数,我对它做了一些修改,以便在它的进程中打印一些信息。现在,我发现了一些输入,一旦我理解了,应该会大大增强我对getchar()的理解 另一方面,当我试图从库中读取源代码时,我完全不知所措。例如,我试图搜索getchar(),结果目瞪口呆地盯着std

继续往下看,看看这篇文章的底部,看看真正的问题

我可能试图去理解一些非常简单的事情,但是在我弄明白之前我无法继续

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

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


另一方面,当我试图从库中读取源代码时,我完全不知所措。例如,我试图搜索getchar(),结果目瞪口呆地盯着stddef.h第300ish行某处一座18人的塔。我打算在不久的将来停止在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;
}
#包括
#定义MAXLINE 5/*最大输入线长度*/
int getline(字符行[],int maxline);
无效副本(字符到[],字符从[]);
/*打印最长的输入行*/
main()
{
int len;/*当前线路长度*/
int max;/*到目前为止看到的最大长度*/
字符行[最大行];/*当前输入行*/
字符最长[MAXLINE];/*保存在此处的最长行*/
max=0;
而((len=getline(line,MAXLINE))>0)
如果(长度>最大值){
max=len;
副本(最长,行);
}
如果(max>0)/*有一条线*/
printf(“%s\n”,最长);
printf(“信息:max=%d\n”,max);
printf(“信息:sizeof s[]=%d”,sizeof最长);
返回0;
}
/*getline:将一行读入s,返回长度*/
int getline(字符s[],int lim)
{
int c,i;
对于(i=0;i

下面是一些输入/输出示例:我使用的是代码块和Windows7

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

我的假设是,可能将显示为
^Z
的EOF字符放在windows终端中,数组会被截断为4个字符的长度加上一个空终止符。结果是,如果我将EOF字符放在要读取的行中,则保存的行
s[]
将只包含最大大小为5的行。同样让我困惑的是变量
len
总是0,这是因为
len
是在main()中的while循环期间分配的,并且在while循环中断后不会保存其值吗

我感兴趣的是,getline()中for循环后面的if语句可以在for循环内部,也可以在for循环外部,并且它不会改变程序,这可能不是有经验的C用户所感兴趣的。有趣的是,这不意味着无论for循环是否执行主体中的任何代码,至少(c=getchar())都会执行吗


抱歉,这个问题太冗长了,我非常感谢您的宝贵意见/回答。

因为
MAXLINE
是5,而
getline
函数读取的字符数从来不会超过
MAXLINE-1
个。

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

先生,您是一个快速调试器。如果答案在第二行,那么很容易做到快速。@Leonardo您应该将此标记为答案,以便从一大堆未回答的问题中解脱出来。先生,是一个快速的调试器。如果答案在第二行,那么很容易变得快速。@Leonardo你应该把这个标记为答案,以便从一大堆未回答的问题中解脱出来。