snprintf的用法

简介: 简要介绍了snprintf的常用方法,能大大的简化我们的代码

snprintf()是一个C语言标准库中的函数,用于将一个格式化的字符串写入一个字符数组中。与其类似的函数有sprintf(),但snprintf()提供了更好的安全性, 避免了可能的缓冲区溢出问题。

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

其中,str为指向输出字符数组的指针,size表示字符数组的最大长度,format为格式化字符串,最后的省略号表示可以传入任意数量和类型的参数,这些参数将按照format中给定的格式进行格式化输出。
snprintf() 函数的返回值是输出到 str 缓冲区中的字符数,不包括字符串结尾的空字符 \0。
snprintf()函数在将格式化字符串写入字符数组时会控制输出的长度,避免字符数组溢出的情况发生。如果输出长度超过了size的限制,超出部分会被截断,并保证最终的字符数组以'\0'结尾。
snprintf() 函数在格式化字符串时,可以避免缓冲区溢出。
如果格式化后的字符串的长度超过了 size-1,则 snprintf() 函数只会写入 size-1 个字符,并在字符串的末尾添加一个空字符(\0)以表示字符串的结束。
如果 str 参数为 NULL,则 snprintf() 函数不会写入任何字符,但仍然返回计划写入的字符数。
如果 size 参数为 0,则 snprintf() 函数不会写入任何字符,但仍然返回计划写入的字符数。
snprintf() 函数不支持浮点数的格式化,如果需要格式化浮点数,应使用 sprintf() 函数。
在使用 snprintf() 函数时,需要注意格式化字符串的安全性,尤其是在使用用户提供的字符串时。如果格式化字符串中包含用户输入的字符串,并且该字符串中包含格式化指令,可能会导致安全问题。可以使用一些安全的字符串格式化库,例如 snprintf_s(),_snprintf(),_sntprintf() 等

HEX数组转字符串
例如有以下代码,需要把保存MAC地址的数组mac_buff[6]的内容转换成字符串并保存在mac_str[16]中:

#include <stdio.h> 

uint8_t mac_buff[6] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB} 

/* MAC地址转成字符串后是12个字符,加上\0结尾,总共需要13个sizeof(char)保存,为了留有余量,且保证数组的空间是4的整数倍,因此定义数组大小为16个Byte */ 
uint8_t mac_str[16]; 

int main(void) 
{ 
  snprintf(mac_str, sizeof(mac_str), "%.2x%.2x%.2x%.2x%.2x", mac_buff[0], mac_buff[1], mac_buff[2], mac_buff[3], mac_buff[4], mac_buff[5]); 
  printf("mac_str:%s.\r\n", mac_str); 

  return 0; 
}

该程序运行后的结果是:mac_str:1234567890AB

拼接多个字符串

#include <stdio.h> 

int main() { char buffer[100]; int bytes_written = snprintf(buffer, 100, "output:%s-%s-%d", "Hello", "World", 123); printf("%s\n", buffer); printf("Bytes written: %d\n", bytes_written); return 0; }
相关文章
|
机器学习/深度学习 编解码 算法
开源! ! ! 轻量级多功能按键驱动-LiteButton
开源! ! ! 轻量级多功能按键驱动-LiteButton
|
传感器 数据采集 数据格式
RS485和Modbus通信协议,让工业自动化更高效!
RS485和Modbus通信协议,让工业自动化更高效!
|
程序员 开发工具 git
批处理--节约你的开发时间
批处理--节约你的开发时间
|
4月前
|
人工智能 自然语言处理 语音技术
智谱开源GLM-ASR:动动嘴,活就干了
智谱发布并开源GLM-ASR系列语音识别模型,推出桌面端AI输入法。包含云端旗舰模型GLM-ASR-2512与端侧轻量版GLM-ASR-Nano-2512(仅1.5B参数),实现高精度、低延迟、强隐私保护的语音转写。输入法集成大模型能力,支持语音指令、翻译、改写、人设切换、Vibe Coding等功能,让用户“动嘴干活”,提升办公效率。现已免费开放体验。
1194 0
|
Python
Python实用记录(十六):PyQt/PySide6联动VSCode便捷操作指南
本文提供了一份详细的PySide6与VSCode联动的操作指南,包括安装配置VSCode、安装必要的扩展、配置扩展以及编辑和运行PySide6项目。文中还提到了相关工具如uic.exe、rcc.exe和designer.exe的用途,并提供了进一步学习的资源。
2531 1
Python实用记录(十六):PyQt/PySide6联动VSCode便捷操作指南
欧拉服务器修改系统时间
【10月更文挑战第27天】欧拉服务器修改系统时间
3346 1
|
C++
spdlog 日志库部分源码说明——日志格式设定,DIY你自己喜欢的调试信息,你能调试的远比你想象的还要丰富
spdlog 日志库部分源码说明——日志格式设定,DIY你自己喜欢的调试信息,你能调试的远比你想象的还要丰富
1806 6
|
Linux C语言
Linux gcc升级全过程,过程超详细
Linux gcc升级全过程,过程超详细
7922 0
Linux gcc升级全过程,过程超详细
从零开始做逆变器系列 ( 二 ): 单极性、双极性、单极性倍频SPWM
从零开始做逆变器系列 ( 二 ): 单极性、双极性、单极性倍频SPWM