sprintf 是 C 语言标准库 stdio.h 里面的格式化函数,核心作用和 printf 很像,printf 是把格式化内容打印到屏幕,sprintf 是把格式化之后的字符串写入到指定字符缓冲区,返回值是成功写入的字符个数,它经常用来拼接字符串 数字转字符串 组合报文 生成日志文本,是嵌入式和 C 语言开发高频函数。很多新手容易混淆 sprintf 和 printf,还经常犯缓冲区溢出的错误,因为 sprintf 本身不会自动检查目标数组大小,写入内容超过数组长度就会覆盖相邻内存,造成程序崩溃,这是这个函数最大的风险点,学习的时候除了掌握格式控制符,还要理解返回值 缓冲区风险 安全替代函数 snprintf,完整掌握它的调用方式和注意事项。
基础语法
int sprintf (char str, const char format, 可变参数列表)
头文件 stdio.h
参数说明
str 目标字符数组首地址,用来存放生成后的字符串
format 格式化字符串,和 printf 格式符写法一致
可变参数 对应格式占位符的变量
返回值 成功输出的字符数量,不包含末尾自动追加的 \0,出错返回负数
常用格式控制符表格
| 格式符 | 作用 |
|---|---|
| d | 十进制整数 |
| x | 十六进制小写 |
| X | 十六进制大写 |
| f | 浮点数 |
| s | 字符串 |
| c | 单个字符 |
| o | 八进制整数 |
| u | 无符号十进制整数 |
基础代码示例
include stdio.h
int main
char buf 100
int num = 2026
sprintf buf 年份是 d num
printf s buf
return 0
运行之后 buf 里面就保存字符串 年份是 2026
核心特点
第一 自动在生成字符串末尾添加结束符 \0,这点一定要记住,目标数组必须预留这个字节空间
第二 可变参数类型必须和格式控制符匹配,类型不匹配会出现乱码,属于未定义行为
第三 没有内置长度保护,输出内容大于缓冲区容量就会溢出,破坏栈内存
第四 返回值可以用来判断写入字符数量,方便后续逻辑判断
sprintf 和 snprintf 对比表格
| 函数 | 是否限制最大写入长度 | 安全性 |
|---|---|---|
| sprintf | 不限制 | 低,存在溢出风险 |
| snprintf | 可以指定最大写入字节 | 高,推荐生产代码使用 |
高频使用场景清单
数字转字符串
多段文本拼接
串口报文组包
日志信息拼装
十六进制数据转可读文本
使用步骤
第一步 引入头文件 stdio.h,提前定义足够大小的字符缓冲区
第二步 编写 format 格式化模板,按照需求填写 d f s x 这类占位符
第三步 后面依次传入对应的变量,保证变量类型和占位符匹配
第四步 调用 sprintf,结果自动存入缓冲区,末尾自动补 \0
第五步 读取返回值,确认写入字符数量,业务场景推荐改用 snprintf 防止缓冲区溢出
第六步 调用完成之后,使用缓冲区里面的字符串,后续打印或者发送数据
sprintf 函数核心就是格式化写入字符缓冲区,和 printf 唯一差别就是输出目的地是内存字符串而不是屏幕,重点警惕缓冲区溢出风险,掌握格式符匹配规则,理解返回值含义,项目开发优先考虑 snprintf 替代 sprintf 提升稳定性。
【常见问题】
问题 1 sprintf 函数的用法和 printf 有什么区别
回答 1 sprintf 函数的用法核心是把格式化字符串写入内存缓冲区,printf 是输出到屏幕,两者格式控制符写法基本一致。
问题 2 sprintf 函数的用法里面会不会自动添加结束符
回答 2 sprintf 函数的用法执行完成之后,会自动在生成字符串末尾追加 \0 结束符,缓冲区要预留对应字节空间。
问题 3 sprintf 函数的用法最大隐患是什么
回答 3 sprintf 函数的用法最大隐患是缓冲区溢出,函数不会校验目标数组长度,写入内容过长会覆盖相邻内存。
问题 4 sprintf 函数的用法返回值代表什么
回答 4 sprintf 函数的用法返回值是成功写入的字符个数,不包含末尾 \0,调用失败的时候返回负数。
【免责申明】
本内容仅作为 C 语言函数学习参考,不同编译器对 sprintf 实现细节略有差异,生产项目编码请遵循安全编码规范,优先使用带长度限制的 snprintf。


