一.sprintf
函数
sprintf
函数是 C 标准库中的一个函数,用于将格式化的数据写入字符串。与 printf
类似,但 sprintf
的输出是写入到字符数组(字符串)中,而不是输出到标准输出(屏幕)。
函数原型
int sprintf(char *str, const char *format, ...);
- str:一个指向字符数组的指针,表示输出的目标字符串。
- format:格式化字符串,类似于
printf
使用的格式化字符串。- ...:一个或多个待格式化的变量,与
format
中的格式说明符对应。返回值
sprintf
函数返回写入字符串的字符总数(不包括终止的 null 字符\0
)。如果发生错误,返回一个负值。
#include <stdio.h>
int main() {
char buffer[100]; // 用来存放格式化后的字符串
int age = 25;
float height = 5.9;
// 将格式化字符串写入 buffer
int n = sprintf(buffer, "Age: %d, Height: %.2f", age, height);
printf("Formatted string: %s\n", buffer); // 输出格式化后的字符串
printf("Number of characters written: %d\n", n); // 输出写入的字符数
return 0;
}
输出:
Formatted string: Age: 25, Height: 5.90
Number of characters written: 26
二.格式化说明符
sprintf
使用的格式化说明符与printf
类似,常见的有:
%d
:整数(十进制)%f
:浮点数%s
:字符串%c
:字符%x
:十六进制整数%p
:指针%u
:无符号整数%.nf
:浮点数,保留小数点后n
位
三.注意事项
重要注意事项
缓冲区大小:
sprintf
不会检查目标缓冲区str
的大小,可能会导致缓冲区溢出。为了避免这种情况,建议使用snprintf
,它允许你指定缓冲区的大小。例子:
snprintf(buffer, sizeof(buffer), "Age: %d", age);
返回值检查:返回值表示写入的字符数,如果返回负值,表示发生了错误。通常可以用于检查是否有错误发生。
格式化字符串的安全性:如果
format
字符串由外部输入(例如用户输入),必须非常小心格式字符串的安全性,避免格式化字符串攻击(格式化字符串漏洞)。
四.snprintf
为了防止缓冲区溢出,推荐使用 snprintf
4.1 函数原型
int snprintf(char *str, size_t size, const char *format, ...);
它提供了一个额外的参数 n
来限制写入的最大字符数 size_t size
- size:最大字符数,包括终止符
\0
。- 返回值:返回实际写入的字符数(如果不超过
size
),如果返回值大于或等于size
,表示输出被截断。
#include <stdio.h>
int main() {
char buffer[50];
int num = 123456;
// 使用 snprintf 防止溢出
int written = snprintf(buffer, sizeof(buffer), "Number: %d", num);
printf("Formatted string: %s\n", buffer);
printf("Number of characters written: %d\n", written);
return 0;
}
五.总结
sprintf
用于将格式化的数据写入字符串。- 使用时要特别注意缓冲区的大小,避免溢出。
- 为了避免潜在的溢出问题,推荐使用
snprintf
,它可以安全地限制写入的字符数。