【发布时间】:2015-04-18 15:12:00
【问题描述】:
当我想使用 sprintf 函数时,char 数组(缓冲区)的正确大小是多少?
如果缓冲区只能容纳 1 个字符,我不知道为什么这部分代码可以工作?我在里面放了比 1 更多的字符。
/* sprintf example */
#include <stdio.h>
int main ()
{
char buffer[1];
int n, a=5, b=3;
n = sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a string %d chars long\n", buffer, n);
return 0;
}
结果:
[5 plus 3 is 8] is a string 13 chars long
【问题讨论】:
-
如果您使用 C++,您可以使用
std::string和std::stringstream类来完成此操作,而无需考虑内存要求。如果你必须使用sprintf,也许this question and its answers会帮助你。 -
这个程序失控了! sprintf 函数正在将数据写入未分配的内存区域!当您使用 sprintf 时,您必须知道,或者您必须让程序能够计算出要使用的缓冲区的尺寸。为了避免内存边界问题,您可以使用处理缓冲区维度的 snprintf() 函数。
-
"buffer can only hold only 1 char" ...并且该char只能是
'\0',因为buffer被认为是一个字符串;其他任何东西,当您使用buffer作为字符串时调用 UB (strlen(buffer),strcat(), ...)