【发布时间】:2020-04-04 20:12:34
【问题描述】:
程序应打印所有长度大于MINLINE 5 且小于MAXLINE 10 的输入行。参考。 K&R 书练习 1.17
#include <stdio.h>
#define MAXLINE 10
#define MINLINE 5
int getlines(char lines[], int maxline);
int main()
{
int length;
char lines[MAXLINE];
while ((length = getlines(lines, MAXLINE)) > 0)
{
if (length > MINLINE)
printf("%s", lines);
}
return 0;
}
int getlines(char lines[], int maxline)
{
int i, c;
for (i = 0; i < maxline - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
{
lines[i] = c;
}
if (c == '\n')
{
lines[i] = c;
++i;
}
lines[i] = '\0';
return i;
}
期望的输出应该是这样的:-
Hello\n
Hello\n
hi\n
excuseMe\n
excuseMe\n
longLineNotToBePrinted\n
done
done
但出乎意料的是,程序打印的行比MAXLINE 长得多,有时打印的行会省略一些尾随字符。
【问题讨论】:
-
C99 及更高版本需要
main()上的显式返回类型(int)。您不应该使用 30 年前的 C 方言写作。这是当今谨慎对待 K&R 的众多原因之一。 -
好的先生,我会从下次开始做
-
找出答案的最佳方法是在调试器中运行您的程序并逐行执行。
-
getlines()中的代码一次最多可读取 MAXLINE 个字符,但会留下输入中较长的行的剩余部分,以便为下一次输入操作做好准备。如果部分行长于 5(6 或更多),则您的代码会将其写出。如果行尾太短,您的代码不会打印它。 -
您需要测试 maxline-3 以便仍然可以附加 \n\0。