使用sprintf()连接格式化字符串是否安全?

时间:2014-12-11 20:34:43

标签: c string visual-c++ string-concatenation c-strings

我正在编写一个程序,需要逐步构建格式化字符串,作为最后一个阶段打印出来。该字符串包括在字符串形成时收集的数字。因此,我需要将格式化的字符串片段添加到输出字符串。

一种直接的方法是将sprintf()用于包含格式化片段的临时字符串,然后使用strcat()将其连接到输出字符串,如this answer中所示。< / p>

更复杂的方法是在添加新片段时将sprintf()指向当前输出字符串的末尾。这证明了here

MSVC sprintf_s() function(以及sprintf()的其他变体)的帮助页面指出:

  

如果在重叠的字符串之间发生复制,则行为是   未定义。

现在,从技术上讲,使用sprintf()将片段连接到输出字符串的末尾意味着覆盖终止NULL,它被认为是第一个字符串的一部分。因此,此操作属于重叠字符串的类别。这项技术似乎运作良好,但它真的安全吗?

1 个答案:

答案 0 :(得分:1)

您链接到的答案中的方法:

  

strcat() for formatted strings

可以安全地防止重叠字符串问题,但当然使用sprintf而不是snprintf执行无限制写入是不安全的。

什么不安全,以及有关重叠字符串的文字是指什么,如下所示:

snprintf(buf, sizeof buf, "%s%s", buf, tail);

这里,buf的重叠范围既用作输入又用作输出,这导致未定义的行为。不要这样做。