介绍
sprintf 是 C 标准库stdio.h 中的核心函数,作用是:把格式化的数据写入字符串缓冲区,和 printf 用法几乎一样,但不打印到屏幕,而是存入字符数组。
它是开发中最常用的字符串拼接、数字转字符串工具。
函数原型
#include <stdio.h>
int sprintf(char *str, const char *format, ...);
参数说明
str:目标字符数组(缓冲区),必须足够大,能容纳最终生成的字符串 + 结尾\0。format:格式化字符串(和printf完全一样,如%d、%s、%f)。...:可变参数,对应格式化符的变量。
返回值
- 成功:返回写入的字符总数(不包含字符串结尾的
\0)。 - 失败:返回负数。
用法
1. 字符串拼接(最常用)
把多个字符串/变量拼接到一个字符数组里。
#include <stdio.h>
int main() {
char buf[100];
char name[] = "小明";
int age = 20;
// 拼接成一句话
sprintf(buf, "姓名:%s,年龄:%d", name, age);
printf("%s\n", buf);
// 输出:姓名:小明,年龄:20
return 0;
}
2. 数字 → 字符串(int/float 转 char[])
C 语言没有直接的 itoa 标准函数,sprintf 是最通用的转换方法。
char buf[20];
int num = 12345;
float pi = 3.14159;
sprintf(buf, "%d", num); // 整数转字符串 → "12345"
sprintf(buf, "%.2f", pi); // 浮点数转字符串 → "3.14"
3. 格式化输出(补零、对齐)
char buf[20];
int a = 66;
sprintf(buf, "%05d", a); // 补零到5位 → "00066"
sprintf(buf, "%5d", a); // 右对齐5位 → " 66"
4. 拼接文件路径、URL
char path[200];
char dir[] = "/home/data";
char file[] = "log.txt";
sprintf(path, "%s/%s", dir, file);
// 结果:/home/data/log.txt
格式化符
和 printf() 完全通用
| 格式化符 | 作用 | 示例 |
|---|---|---|
%d |
十进制整数 | 100 → “100” |
%f |
浮点数 | 3.14 → “3.140000” |
%.2f |
保留2位小数 | 3.1415 → “3.14” |
%s |
字符串 | “abc” |
%c |
单个字符 | ‘A’ |
%x |
小写十六进制 | 255 → “ff” |
%X |
大写十六进制 | 255 → “FF” |
%05d |
5位宽度,不足补0 | 8 → “00008” |
注意事项
1. 缓冲区必须足够大!(最常见BUG)
sprintf 不会检查目标数组大小,如果数据超长,会内存越界,导致程序崩溃、数据错乱。
// 错误:buf只有5字节,却存了10个字符
char buf[5];
sprintf(buf, "1234567890"); // 越界!崩溃
安全写法:数组大小 ≥ 最大可能长度 + 1(存\0)。
2. 目标缓冲区必须是可写的字符数组
不能用字符串常量指针,会直接崩溃:
// 错误!常量区不可写
char *str = "hello";
sprintf(str, "world");
3. 优先使用 snprintf()(更安全)
snprintf 限制最大写入长度,彻底避免越界,推荐优先使用:
// 最多写入 sizeof(buf)-1 个字符,自动补 \0
snprintf(buf, sizeof(buf), "姓名:%s,年龄:%d", name, age);
sprintf 与 printf 对比
| 函数 | 输出目标 | 用途 |
|---|---|---|
printf |
屏幕(控制台) | 打印显示 |
sprintf |
字符数组(内存) | 拼接字符串、数字转字符串 |
完整示例代码
#include <stdio.h>
int main() {
char buffer[100];
int id = 1001;
float score = 95.5;
char cls[] = "高三(1)班";
// 1. 格式化拼接
int len = sprintf(buffer, "学号:%d,班级:%s,分数:%.1f", id, cls, score);
// 2. 打印结果
printf("生成字符串:%s\n", buffer);
printf("写入字符数:%d\n", len);
// 输出:写入字符数:28(不含\0)
return 0;
}
运行结果
生成字符串:学号:1001,班级:高三(1)班,分数:95.5
写入字符数:28
总结
sprintf= 写入字符串的printf,用于格式化拼接、数字转字符串。- 必须包含头文件
#include <stdio.h>。 - 核心风险:缓冲区溢出,建议用
snprintf替代。 - 格式化规则和
printf完全一致,上手极快。