首页 > 其他分享 >sprintf 将格式化的数据写入字符串

sprintf 将格式化的数据写入字符串

时间:2024-12-08 18:00:37浏览次数:11  
标签:格式化 snprintf buffer 写入 sprintf 字符串

一.sprintf 函数

sprintf 函数是 C 标准库中的一个函数,用于将格式化的数据写入字符串。与 printf 类似,但 sprintf 的输出是写入到字符数组(字符串)中,而不是输出到标准输出(屏幕)。

函数原型

int sprintf(char *str, const char *format, ...);
  • str:一个指向字符数组的指针,表示输出的目标字符串。
  • format:格式化字符串,类似于 printf 使用的格式化字符串。
  • ...:一个或多个待格式化的变量,与 format 中的格式说明符对应。

返回值

sprintf 函数返回写入字符串的字符总数(不包括终止的 null 字符 \0)。如果发生错误,返回一个负值。

#include <stdio.h>

int main() {
    char buffer[100];  // 用来存放格式化后的字符串
    int age = 25;
    float height = 5.9;

    // 将格式化字符串写入 buffer
    int n = sprintf(buffer, "Age: %d, Height: %.2f", age, height);

    printf("Formatted string: %s\n", buffer);  // 输出格式化后的字符串
    printf("Number of characters written: %d\n", n);  // 输出写入的字符数

    return 0;
}

输出:

Formatted string: Age: 25, Height: 5.90

Number of characters written: 26

二.格式化说明符

sprintf 使用的格式化说明符与 printf 类似,常见的有:

  • %d:整数(十进制)
  • %f:浮点数
  • %s:字符串
  • %c:字符
  • %x:十六进制整数
  • %p:指针
  • %u:无符号整数
  • %.nf:浮点数,保留小数点后 n 位

三.注意事项

重要注意事项

  1. 缓冲区大小sprintf 不会检查目标缓冲区 str 的大小,可能会导致缓冲区溢出。为了避免这种情况,建议使用 snprintf,它允许你指定缓冲区的大小。

    例子:

    snprintf(buffer, sizeof(buffer), "Age: %d", age);
  2. 返回值检查:返回值表示写入的字符数,如果返回负值,表示发生了错误。通常可以用于检查是否有错误发生。

  3. 格式化字符串的安全性:如果 format 字符串由外部输入(例如用户输入),必须非常小心格式字符串的安全性,避免格式化字符串攻击(格式化字符串漏洞)。

四.snprintf 

为了防止缓冲区溢出,推荐使用 snprintf

4.1 函数原型

int snprintf(char *str, size_t size, const char *format, ...);

它提供了一个额外的参数 n 来限制写入的最大字符数 size_t size

  • size:最大字符数,包括终止符 \0
  • 返回值:返回实际写入的字符数(如果不超过 size),如果返回值大于或等于 size,表示输出被截断。
#include <stdio.h>

int main() {
    char buffer[50];
    int num = 123456;

    // 使用 snprintf 防止溢出
    int written = snprintf(buffer, sizeof(buffer), "Number: %d", num);

    printf("Formatted string: %s\n", buffer);
    printf("Number of characters written: %d\n", written);

    return 0;
}

五.总结

  • sprintf 用于将格式化的数据写入字符串。
  • 使用时要特别注意缓冲区的大小,避免溢出。
  • 为了避免潜在的溢出问题,推荐使用 snprintf,它可以安全地限制写入的字符数。

标签:格式化,snprintf,buffer,写入,sprintf,字符串
From: https://blog.csdn.net/wydaicls/article/details/144328769

相关文章

  • 输出与文件编码的兼容性 在 .CMD 文件中,通过正确的编码方式(如 UTF-8),可以确保脚本与外
    在计算机科学和技术领域,.CMD和.BAT文件都属于批处理脚本文件格式,它们是Windows操作系统中用于执行命令的一种文件类型。虽然这两者非常相似,但.CMD文件有一些相对于.BAT文件的优势,特别是在Windows2000及以后版本中。下面将分析.CMD文件相对于.BAT文件的一些优势,并......
  • MySQL数据库写入异常,主库内存溢出,扩容+清理buff/cach!很开门
    MySQL数据库写入异常,主库内存溢出,扩容+清理buff/cach!很开门最近数据出现了两次写入异常报错如下:org.springframework,jdbc.UncategorizedsQlException:PreparedstatementCallback;uncategzed50LExcention[sql语句]TheMysOlserverisrunningwiththe--read-onlyoption......
  • editplus json格式化脚本
    editplusjson格式化脚本JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,易于人阅读和编写,同时也易于机器解析和生成。在处理JSON数据时,保持其整洁和格式化的状态对于代码的可读性和维护性至关重要。EditPlus是一款强大的文本编辑器,支......
  • spark 批量写入redis控制
    需求sparkscala程序读取hive数据,sparksql解析然后分批写入redis原则:一、尽可能少和redis交互,减少redis写入压力。二、可以考虑pipeline的操作习惯。三、不要一个partition只提交一个pipeline网络传输压力大内存消耗高Redis服务端处理压力大可能增加命令处理......
  • 读取excel某表的sheet1的前5行,写入的第二个表的sheet1的前5行
     报错了提示缺少xlwt库#从goods_list.xlsx的sheet1表中获取前5行的数据将数据写入到3.xlsx的sheet1表的前5行#从goods_list.xlsx的sheet1表中获取前5行的数据将数据写入到3.xlsx的sheet1表的前5行importpandasaspd#正确读取文件,确保文件名后缀与实际格式一致data......
  • 如果修改权限后仍然遇到“会话目录写入权限不足”的问题,应该怎么办
    如果修改权限后仍然遇到“会话目录写入权限不足”的问题,可以尝试以下几种方法:检查文件所有者:确保这些目录的文件所有者是Web服务器用户(通常是www-data或apache)。可以使用以下命令检查和修改文件所有者:chown-Rwww-data:www-data/path/to/your/domain/configchown-Rwww-......
  • VSCode:代码格式化插件
    settings.json文件中添加如下配置并保存 {"workbench.sideBar.location":"left","cssrem.rootFontSize":80,"git.ignoreWindowsGit27Warning":true,"eslint.codeAction.showDocumentation":{"ena......
  • MarsCode青训营序章Day1|稀土掘金-1.找单独的数、47.完美偶数计数、3.数组字符格式化
    稀土掘金-1.找单独的数(1.找单独的数)题目分析:n个同学每人持有1张写有数字的卡片,除了一个数字之外,其他每个数字均出现了刚好2次,要求设计时间复杂度为O(n)的算法从cards数组中查找该单独的数。题目重点:已知除单独的数外,其余的都是成对的数,则不存在重复次数超过2的数。需要使时......
  • VSCode格式化前端代码后Eslint报错
    VSCode格式化前端代码后Eslint报错>比如Eslint要求函数后面括号,括号前要空一格,但是原来的vsCode格式化不会留这个空格;这是矛盾的;解决方式:两步:1.下载三个插件:ESLint:用于在VSCode中集成ESLint。Prettier-Codeformatter:用于代码格式化Vetur:主要 .vue文件 语法......
  • 开发者必备:构建自定义CLI格式化工具的完整指南 (5)
    一个工具的命令行界面(CLI)背后其实就是调用相应的API。在这里,我们将实现一个简易的CLI工具,通过它来格式化代码。首先,新建一个名为formattool的项目,并使用pnpminit进行初始化:mkdirformattoolcdformattoolpnpminit-y然后,在项目根目录下创建一个index.js文......