sprintf
的语法
c
int sprintf(char *str, const char *format, ...);
str
: 存储结果的字符数组(字符串)的指针。format
: 格式说明字符串,定义了如何格式化后面的参数。...
: 需要格式化的参数列表,数量和类型由format
决定。
返回值
- 返回成功写入的字符总数(不包括 null 结束字符
\0
)。 - 如果返回值大于等于
buf
的大小,则可能导致缓冲区溢出。
格式说明符
格式说明符用于指定如何格式化参数。常用的格式说明符包括:
表格
格式说明符 | 描述 | 示例 |
---|---|---|
%c | 单个字符 | sprintf("%c", 'A') |
%d | 十进制整数 | sprintf("%d", 42) |
%f | 浮点数 | sprintf("%f", 3.14) |
%u | 无符号整数 | sprintf("%u", 42) |
%s | 字符串 | sprintf("%s", "Hello") |
%x | 十六进制整数 | sprintf("%x", 255) |
%p | 指针地址 | sprintf("%p", &var) |
格式说明符的修饰符
可以在 %
和转换字符之间添加修饰符,例如:
%5d
:最小字段宽度为 5。%-5d
:左对齐,宽度为 5。%02d
:不足时填充0
,总宽度为 2。%10.2f
:小数点后保留 2 位,总宽度为 10。
示例
1. 基本用法
c
char buffer[100]; int value = 42; sprintf(buffer, "Value: %d", value); // buffer 内容: "Value: 42"
2. 格式化浮点数
c
float pi = 3.14159; sprintf(buffer, "Pi: %.2f", pi); // buffer 内容: "Pi: 3.14"
3. 格式化字符串
c
sprintf(buffer, "Hello, %s!", "World"); // buffer 内容: "Hello, World!"
4. 格式化指针地址
c
int var = 42; sprintf(buffer, "Address of var: %p", &var); // buffer 内容: "Address of var: 0x7ffee3c0f54"(示例地址)
5. 结合多个参数
c
int a = 10; float b = 3.5; sprintf(buffer, "a = %d, b = %.1f", a, b); // buffer 内容: "a = 10, b = 3.5"
6. 数字填充和对齐
c
sprintf(buffer, "[%5d]", 42); // "[ 42]" sprintf(buffer, "[%-5d]", 42); // "[42 ]" sprintf(buffer, "[%02d]", 42); // "[42]" sprintf(buffer, "[%010.2f]", 3.14159); // "[ 3.14]"
注意事项
-
缓冲区溢出:
- 使用
sprintf
时,确保目标字符串的长度足够,否则会导致缓冲区溢出。 - 建议使用
snprintf
替代,snprintf
允许指定缓冲区的大小:c
snprintf(buffer, sizeof(buffer), "Format: %d", value);
- 使用
-
格式说明符与参数匹配:
- 确保格式说明符与参数的类型匹配,否则会导致意外行为。
- 例如,整数不能使用
%f
格式说明符。
-
字符串终止:
sprintf
会在字符串末尾添加\0
以终止字符串。- 确保目标缓冲区有足够的空间容纳
\0
。
-
错误返回:
- 如果返回值为负数,表示发生了错误(如缓冲区溢出)。
总结
sprintf
是一个非常强大的工具,适用于各种字符串格式化需求。通过合理使用格式说明符和修饰符,可以灵活地控制输出格式。平常完全够用,如果想避免安全风险,建议使用 snprintf
代替 sprintf
。