fgets提示限制为1024字节

Ips*_*rem 1 c prompt fgets

我一直在努力解决在C中编写一个小程序的一个非常简单的问题.

fgets()只要输入的大小不超过1024字节,就可以通过工作获得输入(命令,参数,要执行的标志).输入1024个字符后,不再接受任何字符 - 提示就会停止.我假设问题的原因不在于fgets()参数/配置,否则它至少会使输入达到定义的大小而不是阻塞.

如何fgets()_SC_LINE_MAX(2048)bytes/chars中创建接受行?

Jon*_*ler 6

终端驱动程序限制输入行的长度

正如我在评论中提到的,几乎可以肯定的是,您的终端驱动程序不允许您输入超过1024字节的行; 它不会分配更多的存储空间.这适用于'规范'模式; 有关详细信息,请参阅Canonical与非规范终端输入.

有一个简单的测试程序(现在在问题中).当我在Mac OS X 10.11.4上运行它时,我可以输入1023个字符加上换行符,或者1024个字符但没有换行符,直到我删除它.

对于记录,输入字符串是:

12345678901234567890123456789X123456789Y123456789Z123456789A123456789B123456789C123456789D123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123456789r123456789s123456789t123456789s123456789t123456789u123456789v123456789w123456789x123456789y123456789z123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123456789r123456789s123456789t123456789u123456789v123456789w123456789x123456789y123456789z123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123456789r123456789s123456789t123456789u123456789v123456789w123456789x123456789y123456789z123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123
Run Code Online (Sandbox Code Playgroud)

如果使用换行符复制并粘贴它,则可能会输入OK.如果您再添加任何字符,您可能会让终端向您发出哔哔声.

还有另外一个问题(fgets()限制为1024字节 - 我可以使用什么呢?)几乎肯定会遇到同样的问题 - 实际上并没有给出有用的帮助.

如果您使用诸如GNU readline库之类的库,它可以将终端置于非规范模式,然后可以处理更长的行,因为终端驱动程序不会等到输入换行符之后才将数据发送到程序.对终端输入行长度进行更大限制的重建内核名义上是Linux类系统的一个选项,但不是休闲程序员的任务.

LINE_MAX和相关宏的含义

另请注意,这_SC_LINE_MAXsysconf()用于确定的代码LINE_MAX,其必须至少为{POSIX2_LINE_MAX}(最小2048)的值,其记录为:

除非另有说明,否则当实用程序被描述为处理文本文件时,实用程序的输入行(标准输入或另一个文件)的最大长度(以字节为单位).长度包括尾随的空间<newline>.

请注意,终端不是文本文件.这个限制表示,实用程序,如grep不能错误处理2048字节长的行,但它可能会被更长的行混淆(例如,因为它读取一行的2048字节块,并且'行首'匹配开始长线的第二个或后续的块).

POSIX的基本原理说明:

{LINE_MAX}

除非另有说明,否则这是影响所有实用程序的全局限制.{MAX_CANON}来自POSIX.1-2008的系统接口卷的值可能进一步限制来自终端的输入线.这个{LINE_MAX}价值是争论的主题,并且是那些希望拥有无限制线的人与那些理解许多历史实用工具都是用固定缓冲区编写的人之间的妥协.实用程序编写者经常选择UNIX系统常量BUFSIZ来分配这些缓冲区; 因此,对于I/O线,一些实用程序限制为512字节,而其他实用程序则达到4096字节或更大.

应该注意,{LINE_MAX}仅适用于输入线长度; POSIX.1-2008中没有要求限制输出线的长度.实用程序,如awk,sedpaste理论上可以构造比任何他们收到,这取决于所使用的选项或来自应用程序的指令的输入线的更长的线.它们不需要截断它们的输出{LINE_MAX}.应用程序负责处理此问题.如果将其中一个实用程序的输出通过管道传输到另一个标准实用程序中,则必须考虑行长度限制; fold除其他外,该实用程序可用于确保只有合理的线路长度才能到达公用设施或应用.

并且{MAX_CANON}引用被描述为:

{MAX_CANON}

终端规范输入行中的最大字节数.
最低可接受价值:{_POSIX_MAX_CANON}

而在其他地方(<limits.h>),最小可接受值为_POSIX_MAX_CANON255.