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; }