snprintf的用法

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

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

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; }
相关文章
|
4天前
|
消息中间件 Kubernetes NoSQL
简述strcpy、sprintf、memcpy
简述strcpy、sprintf、memcpy
|
6月前
|
存储 Cloud Native Linux
C++ strcpy、sprintf与memcpy的区别
C++ strcpy、sprintf与memcpy的区别
|
4天前
strlen与sizeof 的基本用法
strlen与sizeof 的基本用法
24 0
|
11月前
sprintf用法
sprintf用法
108 0
|
11月前
fgets(),strtod(),strnlen(),strcmp()函数记录
fgets(),strtod(),strnlen(),strcmp()函数记录
|
人工智能 移动开发 程序员
http://www.vxiaotou.com