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
|
程序员 开发工具 git
批处理--节约你的开发时间
批处理--节约你的开发时间
从零开始做逆变器系列 ( 二 ): 单极性、双极性、单极性倍频SPWM
从零开始做逆变器系列 ( 二 ): 单极性、双极性、单极性倍频SPWM
|
C++
spdlog 日志库部分源码说明——日志格式设定,DIY你自己喜欢的调试信息,你能调试的远比你想象的还要丰富
spdlog 日志库部分源码说明——日志格式设定,DIY你自己喜欢的调试信息,你能调试的远比你想象的还要丰富
1515 6
|
Linux C语言
Linux gcc升级全过程,过程超详细
Linux gcc升级全过程,过程超详细
7725 0
Linux gcc升级全过程,过程超详细
|
新能源
从零开始做逆变器系列文章之逆变原理
从零开始做逆变器系列文章之逆变原理
从零开始做逆变器系列文章之逆变原理
|
安全 Unix Linux
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
687 0
|
安全 编译器 C语言
一文讲清楚内联函数 inline
在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。
|
定位技术
环形缓冲区RingBuff
环形缓冲区RingBuff
|
消息中间件 算法 调度
轻松掌握“裸机”任务调度——使用环形缓冲区、状态机和定时器打造完美方案!
轻松掌握“裸机”任务调度——使用环形缓冲区、状态机和定时器打造完美方案!