C语言-字符串函数:sprintf()格式化字符串、拼接字符串、拼接数字

介绍

sprintf 是 C 标准库stdio.h 中的核心函数,作用是:把格式化的数据写入字符串缓冲区,和 printf 用法几乎一样,但不打印到屏幕,而是存入字符数组。

它是开发中最常用的字符串拼接、数字转字符串工具。

函数原型

#include <stdio.h>

int sprintf(char *str, const char *format, ...);

参数说明

  1. str:目标字符数组(缓冲区),必须足够大,能容纳最终生成的字符串 + 结尾 \0。
  2. format:格式化字符串(和 printf 完全一样,如 %d、%s、%f)。
  3. ...:可变参数,对应格式化符的变量。

返回值

  • 成功:返回写入的字符总数(不包含字符串结尾的 \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

总结

  1. sprintf = 写入字符串的 printf,用于格式化拼接、数字转字符串。
  2. 必须包含头文件 #include <stdio.h>。
  3. 核心风险:缓冲区溢出,建议用 snprintf 替代。
  4. 格式化规则和 printf 完全一致,上手极快。

原文出处:/show_1IX2taPgp6HD.html