【发布时间】:2021-08-06 08:40:42
【问题描述】:
关于 C 编程语言 (K&R) 的问题 - 练习 1-16
嗨,我是 C 的初学者,我正在阅读 K&R。 我对练习 1-16 有疑问。
修改最长行程序的主程序,使其能够正确打印任意长输入行的长度,并尽可能多地打印文本。
既然我们需要打印“尽可能多的文本”,那么 C 中是否有任何函数可以读取和打印无限输入,以便我可以比较它们并打印最长的输入?
这是书中最长的程序
#include <stdio.h>
#define MAXLINE 1000 /* 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]; /* current 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", 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;
if (c == '\n') {
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;
}
【问题讨论】:
-
您可以分块读取任意长的输入(例如一次 1024 个字符)并计算精确长度。
-
一种选择是更改
getline函数,在达到缓冲区大小lim时不要停止读取输入,而是继续读取和计数字符,直到EOF或'\n'不存储他们在缓冲区。通过这种方式,您可以知道实际的行长度,而不会将其限制为缓冲区大小,但是如果行更长,您将只有适合缓冲区的部分。 -
有一个名为getline 的POSIX 函数可以读取任意长度的行并根据需要分配缓冲区。
-
PO 不需要保存整行,因为问题来自 K&R 的第 1 章,它不假设读者有足够的知识来打印整行。对于无限行,有必要使用两遍算法来记住文件中最长的行所在的位置。将最长的行保存在内存中并在最后完全打印实际上受计算机内存量的限制。原始问题不需要完全打印该行,而只需要尽可能多地打印。
标签: c