编程新手,通过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++;
}
}
答案 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,则会得到输出。