K&R练习1.16 – 线路长度限制
我正在从K&R的“ The C Programming Language ”一书中学习C 语言 。 我正在做本书中指定的练习。 我的运动编号为1.16,但我不明白。
练习1.16:
修改最长行程序的主程序,以便正确打印任意长输入行的长度,并尽可能地打印文本。
我的问题:
-
“……文本尽可能多……” – 字符串长度是否存在一些限制? 也许在标准头文件中有一个变量,其中包含字符串长度的最大允许值?
-
“……任意长输入行的长度……” – 但代码MAXLINE定义为1000.它的大小也是有限的。 我在这里看到了一些解决方案,但在我看来,这不是解决方案的决定,因为前者对行的长度有限制(1000个字符)。
也许我不明白这个任务。 我的理解是我必须删除1000个字符的限制。
这是K&R的一个非常早期的练习,你应该对代码进行一些小的改动,而不是对代码进行全面的重新设计。
-
“……尽可能多的文字……”
由你来解释。 我是通过打印存储在
longest
缓冲区中的内容来实现的。 即打印出最多1000个字符的行。 同样,这是一个早期的练习,几乎没有介绍动态分配的内存。 在编写K&R时,存储任意长的文本行并不像现在这样可行。 -
“……任意长输入线的长度……”
是一项艰难的要求。 你应该找到正确的长度,无论它有多长(至少在
int
的范围内)。
解决此问题的一种方法是:
- 在调用getline()之后,检查读入
line
缓冲区的最后一个字符是否是换行符(’\ n’) - 如果是,您阅读完整的一行。
len
变量是行的正确长度(getline()的返回值,与原始代码相比不需要特别考虑。 - 如果不是 ,你没有读完整行,需要寻找这一行的结尾。 你添加一个while循环,调用getchar()直到它返回换行符(或EOF),并计算你在该循环中读取的字符数。 只需要对
len++
进行计数。 - 当while循环完成时,新的
len
现在是该行的实际长度,但是我们的缓冲区只有它的前999个字符。 - 和以前一样,如果此行到目前为止最长,则存储(复制()函数调用)当前
line
缓冲区(最多1000个字符)。 - 完成后,打印出之前存储的行(
longest
缓冲区)和长度的max
变量。- 由于上面提到的while循环,
max
长度现在是正确的。 - 如果
longest
线确实长于1000个字符。 你至少打印出前999个字符 – 这是“尽可能多”。
- 由于上面提到的while循环,
我不会破坏它并发布你需要完成的代码,但只需要6行代码就可以添加到练习1-16的最长行程序中。
-
在现代机器上,“尽可能多的文本”可能是所有文本,这要归功于自动换行终端程序。 那本书是在电传终端仍在使用时编写的。 除了您正在处理的机器的内存限制之外,对字符串长度没有限制。
-
他们期望你添加某种循环来读取字符并查找换行符,而不是假设读入
MAXLINE
大小的缓冲区肯定会包含换行符。