使用sprint()时,缓冲区的适当大小是多少
What is proper size of buffer when using sprint()?
当我想使用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 longn", buffer, n);
return 0;
}
结果:
[5 plus 3 is 8] is a string 13 chars long
当我想使用sprintf函数时,char数组(缓冲区)的适当大小是多少?
没有。
如果您可以从格式字符串和输入类型中计算出上限,那么您可以使用它。例如,一个32位的int
用一个可选符号以十进制表示不需要超过11个字符,因此您的特定示例不需要超过44个字符(除非我计算错误)。
否则,请使用更安全的东西:C++中的std::stringstream
,或C.中的snprintf
和care
我不知道如果缓冲区只能容纳1个字符,为什么这部分代码可以工作?
不是。它正在通过缓冲区的末尾写入其他内存。
也许这不会导致任何明显的错误;也许它会破坏其他一些变量;可能会导致保护故障并结束程序;当函数试图返回时,它可能会破坏堆栈框架并造成各种破坏;或者它可能会导致其他一些不明确的行为。但它的行为肯定不正确。
在您的代码中发生了缓冲区溢出,没有明显的后果,但这并不意味着它工作正常,请尝试使用valgrind之类的内存调试器,您就会明白我的意思。
您不能确保sprintf()
不会溢出缓冲区,这就是为什么有一个snprintf()
函数可以将缓冲区的大小传递给它。
样品使用
char buffer[100];
int result;
result = snprintf(buffer, sizeof(buffer), "%d plus %d is %d", a, b, a + b);
if (result >= sizeof(buffer))
{
fprintf(stderr, "The string does not fit `buffer'.n");
}
假设代码必须使用sprintf()
而不是其他函数:
预先确定最坏情况下的输出大小并添加边距。
除非存在主要的内存问题,否则建议使用2倍的缓冲区。不同的语言环境可以做一些有趣的事情,比如像"123,456,789"
一样将','
添加到整数输出中。
#include <stdio.h>
#include <limits.h>
#define INT_DECIMAL_SIZE(i) (sizeof(i)*CHAR_BIT/3 + 3)
#define format1 "%d plus %d is %d"
char buffer[(sizeof format1 * 3 * INT_DECIMAL_SIZE(int)) * 2];
int n = sprintf(buffer, format1, a, b, a + b);
一个具有挑战性的例子是,当代码尝试sprintf(buf,"%Lf", some_long_double)
时,因为输出可能是1000个字符,而应该是x == LDBL_MAX
。大约5000个字符,二进制128为长双。
// - 123.............456 . 000000
#define LDBL_DECIMAL_SIZE(i) (1 + 1 + LDBL_MAX_10_EXP + 1 + 6 1)
- C++字符*缓冲区的大小
- 复制列表初始化的隐式转换的等级是多少
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- while循环中while循环的时间复杂度是多少
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 如何检查一个c++字符串中有多少相同的字符/数字
- C++有多少类型的循环
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 在 Linux 中存储区域设置名称的缓冲区大小应该是多少?
- std::ostringstream 缓冲区的最大大小是多少
- 使用sprint()时,缓冲区的适当大小是多少
- 我应该等多少,直到套接字的发送缓冲区为空
- C++: boost::asio : 我可以用于 TCP 套接字的最大缓冲区大小是多少?