我正在编写一个程序,需要逐步构建格式化字符串,并在最后阶段打印出来。该字符串包括在形成该字符串时收集的数字。因此,我需要将格式化的字符串片段添加到输出字符串中。
一种直接的方法是使用 sprintf()
来生成包含格式化片段的临时字符串,然后使用 strcat()
将其连接到输出字符串,就像 this answer 中所示.
更复杂的方法是在添加新片段时将 sprintf() 指向当前输出字符串的末尾。这被证明了here .
帮助页面为 MSVC sprintf_s()
function (以及 sprintf()
的其他变体)指出:
If copying occurs between strings that overlap, the behavior is undefined.
现在,从技术上讲,使用 sprintf()
将片段连接到输出字符串的末尾意味着覆盖终止 NULL
,它被视为第一个片段的一部分字符串。因此,这个 Action 属于重叠字符串的范畴。该技术看起来效果不错,但真的安全吗?
最佳答案
您链接到的答案中的方法:
对于重叠字符串问题是安全的,但当然它是不安全的,因为它使用 sprintf
而不是 snprintf
执行无限写入。
什么是不安全的,以及有关重叠字符串的文本所指的内容,类似于:
snprintf(buf, sizeof buf, "%s%s", buf, tail);
这里,buf
的重叠范围同时用作输入和输出,这会导致未定义的行为。不要这样做。
关于c - 使用 sprintf() 连接格式化字符串是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27431898/