【问题标题】:Exceeding buffer size for read()超过 read() 的缓冲区大小
【发布时间】:2013-03-29 07:54:19
【问题描述】:
#define MAX_BUFF_SIZE   64
char input[MAX_BUFF_SIZE];

int inSize = read(0, input, MAX_BUFF_SIZE);
if(inSize <= 0 || inSize > MAX_BUFF_SIZE){
     printf("An error occurred in the read.\n");
     exit(-1);
}

我正在编写一个提示用户输入的程序,该输入的最大长度为 64 个字符。如果用户输入超过 64 个字符,程序应该退出。

我相信我正确使用了read(),但即使我传入 > 64 个字符,它也永远不会导致任何错误/异常。我在这里做错了什么?

无论如何我可以检查用户是否使用 read() 输入了超过 64 个字符?

【问题讨论】:

  • 阅读read() 的文档,就像建议的汽水一样。 inSize &gt; MAX_BUFF_SIZE永远发生,inSize == 0 不是错误。

标签: c unix input


【解决方案1】:

read() 永远不会读取超过您允许的数量的字节。如果您告诉它最多读取 64 个字节,即使有更多可用数据,它也将最多读取 64 个字节。尚未读取的字节可用于进一步阅读(我假设inputSTDIN_FILENO,在这种情况下它们只是留在标准输入缓冲区中)。

【讨论】:

  • 但 read 似乎返回了输入的尾随部分(64 个字符之后的部分)?无论如何我可以检查用户输入的字符是否超过 64 个?
  • @user1043625 你最需要阅读read() 的文档。 而不是做出假设(“它似乎”等),你可以发现它返回的是读取的字节数。
  • 哇,哇。显然,您是在这里做出假设的人。当我打印出输入时,我得到了输入的尾随部分。
  • @user1043625 你是如何“打印输入”的?如果 read 填满了缓冲区,那么input 通常不是正确的以空值结尾的,使用printf 打印它会产生不可靠的结果。您需要显示更多代码。你真的需要阅读文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 2011-05-17
  • 2014-03-26
  • 2020-09-05
相关资源
最近更新 更多