sprintf与snprintf
sprintf函数:
int sprintf(char *str, const char *format, …);
参数说明:
- str:目标字符串的指针
- format:格式化字符串
- …:可变参数列表
snprintf函数:
int snprintf(char *str, size_t size, const char *format, …);
参数说明:
- str:目标字符串的指针
- size:目标缓冲区的大小,即最多可以放入多少字符,包括结尾的斜杠0
- format:格式化字符串
- …:可变参数列表
sprintf的特点:
- 直接将格式化的字符串写入目标内存区域,直到遇到斜杠0停下
- 没有对输出的字符串长度进行限制,如果提供的缓冲区不够,会导致缓冲区溢出,有安全风险
- 返回值:成功,返回写入的字符串长度;失败,返回负数
snprintf的特点:
- 给指定过大小的内存区域写入数据,可以避免溢出风险
- 如果格式化的字符串长度小于size,则全部写到内存区域中,在结尾带上斜杠0
- 如果格式化的字符串长度大于等于size,只将字符串的size-1的字符写入到str中,并在结尾带上斜杠0
- 返回值:成功,返回预写入的字符串长度,即size-1,因为不包括结尾的斜杠0;失败,返回负数
sprintf的使用:
int main()
{
char buffer[100];
int a = 10;
double b = 3.14;
string c = "hello";
sprintf(buffer, "a: %d, b: %lf, c: %s\n", a, b, c.c_str());
cout << buffer << endl;
return 0;
}
snprintf的使用:
int main()
{
char buffer[100];
int a = 15;
double b = 1.14;
string c = "world";
snprintf(buffer, sizeof(buffer), "a: %d, b: %lf, c: %s\n", a, b, c.c_str());
cout << buffer << endl;
return 0;
}
总结:snprintf在sprintf的基础上增加了对输出长度的控制,提高了代码的安全性。