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

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

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

一种直接的方法是使用 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 属于重叠字符串的范畴。该技术看起来效果不错,但真的安全吗?

最佳答案

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

strcat() for formatted strings

对于重叠字符串问题是安全的,但当然它是不安全的,因为它使用 sprintf 而不是 snprintf 执行无限写入。

什么是不安全的,以及有关重叠字符串的文本所指的内容,类似于:

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

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

关于c - 使用 sprintf() 连接格式化字符串是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27431898/

相关文章:

c++ - 如何在一个字符串中搜索多个子字符串

c++ - 没有合适的默认构造函数可用。 (创建子类时)

我可以使用 "malloc"作为局部变量来返回局部变量吗?

c - 在位数组中查找字节的高效算法

java - 回溯并查找数组中等于某个值 k 的所有子集

javascript - 使用 jQuery 在网页上突出显示字符串的字符

java - 为 Booth 算法实现算术右移

c - 无法接收串口数据

c++ - 条件预处理难题

c++ - wxWidgets ribbonBar 占据整个窗口