c/c++语言开发共享使用sprintf而不使用手动分配的缓冲区

在我正在处理的应用程序中,日志记录工具使用sprintf来格式化写入文件的文本。 所以,像:

 char buffer[512]; sprintf(buffer, ... ); 

当发送的消息对于手动分配的缓冲区而言变得太大时,这有时会导致问题。

有没有办法获得sprintf行为而无需像这样手动分配内存?

编辑:虽然sprintf是一个C操作,我正在寻找C ++类型的解决方案(如果有的话!)让我得到这种行为……

    不,你不能使用sprintf()来分配足够的内存。 替代方案包括:

    您可以使用asprintf(3)(注意:非标准)为您分配缓冲区,因此您无需预先分配它。

    我也不知道避免分配的版本,但如果C99 sprintfs允许作为字符串的NULL指针。 效率不高,但这会给你完整的字符串(只要有足够的内存可用)而不会有溢出的风险:

     length = snprintf(NULL, ...); str = malloc(length+1); snprintf(str, ...); 

    “日志记录工具使用sprintf来格式化写入文件的文本”

    fprintf()不会施加任何大小限制。 如果您可以直接将文本写入文件,请执行此操作!

    但是我假设有一些中间处理步骤。 如果您知道需要多少空间,可以使用malloc()来分配那么多空间。

    有时像这样的一种技术是分配一个合理大小的缓冲区(99%的时间都足够大),如果它不够大,可以将数据分解为逐个处理的块。

    使用spillaf的vanilla版本,无法阻止数据覆盖传入的缓冲区。 无论在堆栈上手动分配或分配内存,都是如此。

    为了防止缓冲区被覆盖,你需要使用一个更安全的sprintf版本,比如sprintf_s(仅限windows)

    需要了解更多c/c++开发分享使用sprintf而不使用手动分配的缓冲区,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享使用sprintf而不使用手动分配的缓冲区相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979382.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐