程序不接受EOF停止读取标准输入

时间:2013-12-27 02:35:42

标签: c eof kernighan-and-ritchie

编程新手,通过K& R工作。在使用stdin输入后,我按^ D来编写EOF(我正在使用linux),并且......没有任何反应。我仍然可以写入控制台,并能够^ Z暂停,但不能使用^ D.我希望我的代码读取输入并打印所有行超过要求的行,并且因为我不能产生任何输出,我不知道从哪里开始诊断我的问题。

/*
Exercise 1-17 in K&R: page 31 in book
Write a program to print all input lines that are longer than 80 characters
*/

# include <stdio.h>
# define MIN_LINE 5         /*change to 80 for final*/
# define MAX_LINE 20        /*change for final*/

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

int main()
{
    char line[MAX_LINE]; 
    int len = 0; 
    char print_register[MAX_LINE];
    int reg_index = 0;

    /*read length of line*/
    while ((len = getline(line, MAX_LINE)) != EOF)
    {
        /*if len > 80; append to print-array*/
        if (len > MIN_LINE) 
        {
            copy(print_register, line, reg_index); 
        }
    }

    /*print the print-array*/
    printf("%s", print_register); 

    return 0; 
}

int getline( char line[], int max)
{
    int i; 
    int c; 

    for (i = 0; (c = getchar()) != EOF && c != '\n' && i <= max; i++)
        {
            line[i] = c; 
        }
    /* handle '\n' and EOF */ 
    if (c == '\n')
    {
        line[i] = c; 
        i++; 
    }

    line[i] = '\0'; 

    return i;  
}

void copy(char to[], char from[], int position)
{
    int i;
    while ((to[position] = from[i]) != '\0')
    {
        i++;
        position++;
    } 
}

2 个答案:

答案 0 :(得分:4)

您的getline()函数返回长度,而不是EOF。因此,应该替换以下陈述:

while ((len = getline(line, MAX_LINE)) != EOF)

EOF应替换为0

while ((len = getline(line, MAX_LINE)) != 0)

答案 1 :(得分:1)

你需要初始化复制功能中的“i”值,否则它可能需要一些意外的值而getline()输出返回的字符数不是EOF所以你需要改变while循环条件。

的变化:

原文:while((len = getline(line,MAX_LINE))!= EOF)

更改:while((len = getline(line,MAX_LINE))!= 0)

void copy(char to[], char from[], int position)
{
    // int i; Original
    int i =0;
    while ((to[position] = from[i]) != '\0')
    {
        i++;
        position++;
    } 
}

如果在复制功能中初始化i = 0,则会得到输出。