- C++
sprintf
- @ 2025-10-27 18:27:57
sprintf 是 C 语言标准库中的一个函数,用于将格式化的数据写入字符串。它的功能类似 printf,但 printf 是输出到控制台,而 sprintf 是输出到指定的字符串缓冲区。
函数原型
#include <stdio.h>
int sprintf(char *str, const char *format, ...);
- 参数:
str:目标字符串缓冲区(用于存储格式化后的结果)。format:格式化字符串(与printf的格式控制符相同)。...:可变参数(需要格式化的数据,如整数、浮点数、字符串等)。
- 返回值:成功时返回写入的字符总数(不包括结尾的
\0);失败时返回负数。
基本用法
1. 基本数据类型格式化
将整数、浮点数等格式化为字符串:
#include <stdio.h>
int main() {
char buffer[100]; // 定义缓冲区
int num = 123;
float f = 3.1415;
// 格式化写入字符串
sprintf(buffer, "整数:%d,浮点数:%.2f", num, f);
printf("结果:%s\n", buffer); // 输出:结果:整数:123,浮点数:3.14
return 0;
}
2. 拼接字符串
将多个字符串拼接为一个字符串:
#include <stdio.h>
int main() {
char name[] = "Alice";
int age = 25;
char info[50];
sprintf(info, "姓名:%s,年龄:%d", name, age);
printf("%s\n", info); // 输出:姓名:Alice,年龄:25
return 0;
}
3. 格式化十六进制/八进制
将整数转换为十六进制或八进制字符串:
#include <stdio.h>
int main() {
int x = 255;
char hex_str[20], oct_str[20];
sprintf(hex_str, "十六进制:%x", x); // %x 小写,%X 大写
sprintf(oct_str, "八进制:%o", x);
printf("%s\n", hex_str); // 输出:十六进制:ff
printf("%s\n", oct_str); // 输出:八进制:377
return 0;
}
注意事项
-
缓冲区溢出风险
sprintf不会检查目标缓冲区str的大小,如果格式化后的字符串长度超过缓冲区容量,会导致缓冲区溢出(覆盖其他内存),引发程序崩溃或安全问题。
解决方法:使用更安全的snprintf(指定最大写入长度):snprintf(buffer, sizeof(buffer), "格式字符串", 参数...); // 最多写入 sizeof(buffer)-1 个字符,自动补 \0 -
返回值的使用
可通过返回值判断是否写入成功(非负数为成功):int len = sprintf(buffer, "test: %d", 100); if (len < 0) { printf("格式化失败\n"); } else { printf("写入了 %d 个字符\n", len); // 输出:写入了 7 个字符("test: 100" 共7个字符) } -
字符串结束符
sprintf会自动在结果字符串末尾添加\0(字符串结束符),但返回值不包含这个\0。
总结
sprintf 是字符串格式化的实用工具,适用于将多种数据类型拼接为字符串。但需注意缓冲区溢出问题,建议优先使用 snprintf 增强安全性。格式控制符的用法与 printf 完全一致,可灵活处理整数、浮点数、字符串等格式。
0 条评论
目前还没有评论...