我正在编写一个程序,需要逐步构建格式化字符串,作为最后一个阶段打印出来。该字符串包括在字符串形成时收集的数字。因此,我需要将格式化的字符串片段添加到输出字符串。
一种直接的方法是将sprintf()
用于包含格式化片段的临时字符串,然后使用strcat()
将其连接到输出字符串,如this answer中所示。< / p>
更复杂的方法是在添加新片段时将sprintf()
指向当前输出字符串的末尾。这证明了here。
MSVC sprintf_s()
function(以及sprintf()
的其他变体)的帮助页面指出:
如果在重叠的字符串之间发生复制,则行为是 未定义。
现在,从技术上讲,使用sprintf()
将片段连接到输出字符串的末尾意味着覆盖终止NULL
,它被认为是第一个字符串的一部分。因此,此操作属于重叠字符串的类别。这项技术似乎运作良好,但它真的安全吗?
答案 0 :(得分:1)
您链接到的答案中的方法:
可以安全地防止重叠字符串问题,但当然使用sprintf
而不是snprintf
执行无限制写入是不安全的。
什么不安全,以及有关重叠字符串的文字是指什么,如下所示:
snprintf(buf, sizeof buf, "%s%s", buf, tail);
这里,buf
的重叠范围既用作输入又用作输出,这导致未定义的行为。不要这样做。