K&R练习1.16 - 线路长度限制

And*_*man 14 c kernighan-and-ritchie c89

我正在从K&R的" The C Programming Language "一书中学习C 语言.我正在做本书中指定的练习.我的运动编号为1.16,但我不明白.

练习1.16:

修改最长行程序的主程序,以便正确打印任意长输入行的长度,并尽可能多地打印文本.

我的问题:

  1. "......尽可能多的文字......" - 字符串长度是否存在一些限制?也许在标准头文件中有一个变量,其中包含字符串长度的最大允许值?

  2. "......任意长输入行的长度......" - 但代码MAXLINE定义为1000.它的大小也是有限的.我在这里看到了一些解决方案,但在我看来这不是解决方案的决定,因为前者对行的长度有限制(1000个字符).

也许我不明白这个任务.我的理解是我必须删除1000个字符的限制.

nos*_*nos 16

这是K&R的早期练习,您只需对代码进行一些小的更改,而不是对代码进行全面的重新设计.

  1. "......尽可能多的文字......"

    由你来解释.我是通过打印存储在longest缓冲区中的内容来实现的.即打印出最多1000个字符的行.同样,这是一个早期的练习,几乎没有介绍动态分配的内存.在编写K&R时,存储任意长的文本行并不像今天那样可行.

  2. "......任意长输入线的长度......"

    是一项艰难的要求.你应该找到正确的长度,无论它有多长(至少在一个范围内int).

解决此问题的一种方法是:

  • 在调用getline()之后,检查读入line缓冲区的最后一个字符是否是换行符('\n')
  • 如果是,您阅读完整的一行.的len变量是线(函数getline的返回值()的正确的长度,并与原来的代码不需要特殊考虑.
  • 如果不是,你没有读完整行,需要寻找这一行的结尾.你添加一个while循环,调用getchar()直到它返回换行符(或EOF),并计算你在该循环中读取的字符数.只是做len++数数.
  • 当while循环完成时,new len现在是行的实际长度,但是我们的缓冲区只有它的前999个字符.
  • 和以前一样,line如果这条线到目前为止最长,你可以将(copy()函数调用)存储到当前缓冲区(最多1000个字符).
  • 完成后,打印出之前存储的行(longest缓冲区)和max长度变量.
    • 由于上面提到的while循环,max现在长度是正确的.
    • 如果该longest行确实长于1000个字符.你至少打印出那些前999个字符 - 这是"尽可能多".

我不会破坏它并发布你需要的代码来实现这一点,但是你需要将6行代码添加到练习1-16的最长行程序中.