如何防止扫描导致C中的缓冲区溢出?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (55)

我使用以下代码:

while ( scanf("%s", buf) == 1 ){

防止缓冲区溢出的最佳方法是什么,以便可以传递随机长度的字符串?

我知道我可以通过调用例如:

while ( scanf("%20s", buf) == 1 ){

但我更希望能够处理用户输入的任何内容。或者这不能安全地使用扫描和我应该使用fget?

提问于
用户回答回答于

如果你使用的是gcc,则可以使用GNU扩展a说明符让scanf()为你分配内存以容纳输入:

int main()
{
  char *str = NULL;

  scanf ("%as", &str);
  if (str) {
      printf("\"%s\"\n", str);
      free(str);
  }
  return 0;
}
用户回答回答于

通过使用snprintf()创建具有正确缓冲区大小的字符串来传递给scanf()函数来解决这个问题。有效:

int scanner(const char *data, char *buffer, size_t buflen)
{
    char format[32];
    if (buflen == 0)
        return 0;
    snprintf(format, sizeof(format), "%%%ds", (int)(buflen-1));
    return sscanf(data, format, buffer);
}

请注意,这仍将输入限制为“缓冲区”提供的大小。如果你需要更多空间,那么你必须做内存分配,或者使用一个非标准的库函数为你分配内存。

注意的POSIX 2008(2013)版本scanf()系列的功能支持的格式修改m字符串输入( ,%s,)。%c %[它不采用char *参数,而是采用char **参数,并为其读取的值分配必要的空间:

char *buffer = 0;
if (sscanf(data, "%ms", &buffer) == 1)
{
    printf("String is: <<%s>>\n", buffer);
    free(buffer);
}

如果sscanf()函数不能满足所有的转换规范,那么%ms在函数返回之前释放它为类转换分配的所有内存。

所属标签

可能回答问题的人

  • 找虫虫

    0 粉丝0 提问6 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问5 回答
  • 优惠活动秘书

    0 粉丝2 提问5 回答
  • 爸爸

    腾讯 · 客户端安全 (已认证)

    4 粉丝4 提问5 回答

扫码关注云+社区

领取腾讯云代金券