C fgets提示符限制为1024字节

C fgets提示符限制为1024字节,c,prompt,fgets,C,Prompt,Fgets,我一直在努力解决一个非常简单的问题,用C语言编写一个小程序 只要输入的大小不超过1024字节,就可以通过fgets获取要执行的输入命令、参数和标志。输入1024个字符后,将不再接受更多字符-提示将停止。我假设问题的原因不在于fgets参数/配置,因为否则它至少会将输入增加到定义的大小,而不是阻塞 如何使FGET接受长度为_SC_LINE_MAX 2048字节/字符的行?终端驱动程序限制输入行的长度 正如我在评论中所指出的,问题几乎可以肯定,终端驱动程序不允许您输入长度超过1024字节的行;它不会

我一直在努力解决一个非常简单的问题,用C语言编写一个小程序

只要输入的大小不超过1024字节,就可以通过fgets获取要执行的输入命令、参数和标志。输入1024个字符后,将不再接受更多字符-提示将停止。我假设问题的原因不在于fgets参数/配置,因为否则它至少会将输入增加到定义的大小,而不是阻塞

如何使FGET接受长度为_SC_LINE_MAX 2048字节/字符的行?

终端驱动程序限制输入行的长度 正如我在评论中所指出的,问题几乎可以肯定,终端驱动程序不允许您输入长度超过1024字节的行;它不会分配更多的存储空间。适用于“规范”模式;有关详细信息,请参阅

问题中有一个简单的测试程序。当我在Mac OS X 10.11.4上运行它时,我可以输入1023个字符加上换行符,或者输入1024个字符,但在删除一个之前不能输入换行符

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

12345678901234567890123456789X123456789Y123456789Z123456789A123456789B123456789C123456789D123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123456789r123456789s123456789t123456789s123456789t123456789u123456789v123456789w123456789x123456789y123456789z123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123456789r123456789s123456789t123456789u123456789v123456789w123456789x123456789y123456789z123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123456789r123456789s123456789t123456789u123456789v123456789w123456789x123456789y123456789z123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123
如果用换行符复制并粘贴,则可能会输入OK。如果你再加上任何字符,你可能会听到终端向你发出嘟嘟声

还有一个问题几乎肯定也遇到了同样的问题——实际上没有得到多少有用的帮助

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

行_MAX和相关宏的含义 还请注意,_SC_LINE_MAX是用于确定LINE_MAX的代码,它必须至少是{POSIX2_LINE_MAX}最小值2048,记录如下:

除非另有说明,当实用程序被描述为处理文本文件时,该实用程序的输入行的最大长度(以字节为单位)可以是标准输入或其他文件。长度包括拖尾的空间

请注意,终端不是文本文件。这一限制表明,诸如grep之类的实用程序不能错误处理2048字节长的行,但它可能会被较长的行弄糊涂,例如,因为它读取一行的2048字节块,并且在第二行或随后的长行块的开头进行“行首”匹配

POSIX的基本原理说明:

{LINE_MAX}

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

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

引用的{MAX_CANON}描述为:

{MAX_CANON}

终端规范输入行中的最大字节数。 最小可接受值:{u POSIX_MAX_CANON}


在其他地方,_POSIX_MAX_CANON的最小可接受值为255。

您使用的是什么OS/shell?很可能是shell的局限性。将输入放入文件中,然后使用shell的IO间接寻址机制将文件内容通过管道传输到程序的stdin。如果您键入的是长行,问题在于系统上的终端驱动程序,但它比Mac OS X更慷慨。请共享您的代码,即使它可能非常简单。然后其他人可以验证您的findings@RSahu:很公平。精确和简洁并不总是齐头并进的。我在MacOSX10.11.4上进行了测试,限制为10241023条非换行线加上一条换行线。这很奇怪:我相当肯定以前我是跑进去的 这个限制大约是256个字符——但距离我上次显式测试它已经有一段时间了,当我试图将大量JSON复制到某个文件中时,这个问题通常会表现出来。