1. sprintf函数基础认知
在C语言标准库中,sprintf函数堪称字符串格式化处理的瑞士军刀。与直接输出到标准输出的printf不同,sprintf将格式化结果存储到字符数组中,这种特性使其成为构建动态字符串的利器。我在嵌入式系统开发中,经常用它来生成JSON格式的传感器数据报文,或是构造SQL查询语句。
函数原型如下:
c复制int sprintf(char *str, const char *format, ...);
第一个参数str是目标字符数组的指针,format是包含格式说明符的字符串,后续可变参数对应格式字符串中的各个占位符。这个设计看似简单,但实际使用时有许多细节需要注意:
警告:必须确保目标数组足够大以容纳结果字符串,包括结尾的空字符'\0',否则会导致缓冲区溢出。我曾在一个物联网项目中因为少计算了2个字节,导致设备频繁重启。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 格式说明符深度剖析
2.1 基础格式控制
格式说明符通常以百分号%开头,基本结构为:
code复制%[flags][width][.precision][length]specifier
常用specifier包括:
- %d/%i:有符号十进制整数
- %u:无符号十进制整数
- %f:浮点数(默认6位小数)
- %c:单个字符
- %s:字符串
- %p:指针地址
- %x/%X:十六进制整数(小写/大写)
在日志系统开发时,我常用组合格式:
c复制char log[100];
sprintf(log, "[%s] Error %d: %s", timestamp, errno, errmsg);
2.2 宽度与对齐控制
width指定最小字段宽度,配合flags实现丰富排版:
| Flag | 作用 | 示例 | 输出结果 |
|---|---|---|---|
| - | 左对齐 | %-10s | "hello " |
| 0 | 用0填充 | %08d | "00012345" |
| + |
