众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf.
自从snprintf代替了sprintf,相信大家对snprintf的使用都不会少,函数定义如下:

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

函数说明:最多从源串中拷贝size-1个字符到目标串中,然后再在后面加一个 \0 。所以如果目标串的大小为size的话,将不会溢出。

函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。

Result1(推荐的用法)

#include <stdio.h>
#include <stdlib.h>int main()
{char str[10]={0};snprintf(str, sizeof(str), "0123456789012345678");printf("str=%s\r\n", str);return 0;
}
root] /root/lindatest
$ ./test
str=012345678

Result2:(不推荐使用)


#include <stdio.h>
#include <stdlib.h>
int main()
{char str[10]={0};snprintf(str, 18, "0123456789012345678");printf("str=%s\r\n", str);return 0;
}
root] /root/lindatest
$ ./test
str=01234567890123456

情形一】:源串小于目标字符串

实际上源串为:"123\0",所以只将字符'1','2','3', '\0'拷到了目标串,返回值为源串的strlen为3

#include <stdio.h>
#include <strings.h>
#include <string.h>
int main(void)
{char a[10] = {'\0'};int i = 0;int ret = 0;memset(a, 0, sizeof(a));for(i = 0; i < 10; i++) {printf("a[%d] = %d\n",i,a[i]);}ret = snprintf(a, 10, "%d", 123);printf("ret = %d\n",ret);for(i = 0; i < 10; i++) {printf("a[%d] = %d\n",i,a[i]);}return 0;
}
a[0] = 0
a[1] = 0
a[2] = 0
a[3] = 0
a[4] = 0
a[5] = 0
a[6] = 0
a[7] = 0
a[8] = 0
a[9] = 0
ret = 3
a[0] = 49
a[1] = 50
a[2] = 51
a[3] = 0
a[4] = 0
a[5] = 0
a[6] = 0
a[7] = 0
a[8] = 0
a[9] = 0--------------------------------
Process exited after 0.1323 seconds with return value 0
请按任意键继续. . .

情形二】:源串等于目标字符串

源串为"abcdefghi\0",正好将源串拷贝到目标字符串中,返回值为源串的strlen为9

#include <stdio.h>
#include <strings.h>
#include <string.h>
int main(void)
{char a[10] = {'\0'};int i = 0;int ret = 0;memset(a, 0, sizeof(a));for(i = 0; i < 10; i++) {printf("a[%d] = %d\n",i,a[i]);}ret = snprintf(a, 10, "%s","abcdefghi");printf("ret = %d\n",ret);for(i = 0; i < 10; i++) {printf("a[%d] = %d\n",i,a[i]);}return 0;
}
a[0] = 0
a[1] = 0
a[2] = 0
a[3] = 0
a[4] = 0
a[5] = 0
a[6] = 0
a[7] = 0
a[8] = 0
a[9] = 0
ret = 9
a[0] = 97
a[1] = 98
a[2] = 99
a[3] = 100
a[4] = 101
a[5] = 102
a[6] = 103
a[7] = 104
a[8] = 105
a[9] = 0--------------------------------
Process exited after 0.3018 seconds with return value 0
请按任意键继续. . .

情形三】源串大于目标字符串

源串为"abcdefghijklmnopq\0",最多从源串拷贝10个字节(含\0)到目标串那么就是拷贝源串的9个字节内容(abcdefghi)再加一个\0到目标串,目标串的结果和情形二一样,但是ret返回值变成了17,即strlen("abcdefghijklmnopq")

#include <stdio.h>
#include <strings.h>
#include <string.h>
int main(void)
{char a[10] = {'\0'};int i = 0;int ret = 0;memset(a, 0, sizeof(a));for(i = 0; i < 10; i++) {printf("a[%d] = %d\n",i,a[i]);}ret = snprintf(a, 10, "%s", "abcdefghijklmnopq");printf("ret = %d\n",ret);for(i = 0; i < 10; i++) {printf("a[%d] = %d\n",i,a[i]);}return 0;
}

在VC中编译如下程序:

a[0] = 0
a[1] = 0
a[2] = 0
a[3] = 0
a[4] = 0
a[5] = 0
a[6] = 0
a[7] = 0
a[8] = 0
a[9] = 0
ret = -1
a[0] = 97
a[1] = 98
a[2] = 99
a[3] = 100
a[4] = 101
a[5] = 102
a[6] = 103
a[7] = 104
a[8] = 105
a[9] = 106--------------------------------
Process exited after 0.02983 seconds with return value 0
请按任意键继续. . .

在GCC中编译如下程序:

a[0] = 0
a[1] = 0
a[2] = 0
a[3] = 0
a[4] = 0
a[5] = 0
a[6] = 0
a[7] = 0
a[8] = 0
a[9] = 0
ret = 17
a[0] = 97
a[1] = 98
a[2] = 99
a[3] = 100
a[4] = 101
a[5] = 102
a[6] = 103
a[7] = 104
a[8] = 105
a[9] = 106--------------------------------
Process exited after 0.02983 seconds with return value 0
请按任意键继续. . .

snprintf打印16进制

snprintf(temp, sizeof temp, "%X", USART_RX_BUF[0]);

%02x     格式控制: 以十六进制输出,2为指定的输出字段的宽度.如果位数小于2,则左端补0

如果USART_RX_BUF[0]里的数据是0xf8,

snprintf(temp, sizeof temp, "%X", USART_RX_BUF[0]);temp[0]的值为0x46;
temp[1]的值为0x38;

参考:https://blog.csdn.net/liaojunwu/article/details/80489406

参考:https://blog.csdn.net/sky1203850702/article/details/52778831

参考:https://blog.csdn.net/shenhuxi_yu/article/details/70195133

snprintf()函数使用方法相关推荐

  1. sprintf函数、snprintf函数、asprintf函数、vsprintf

    sprintf函数: 功能 把格式化的数据写入某个字符串缓冲区. 头文件 stdio.h 原型 int sprintf( char *buffer, const char *format, [ arg ...

  2. [C++]snprintf函数

    snprintf()函数用于将格式化的数据写入字符串,其原型为:     int snprintf(char *str, int n, char * format [, argument, ...]) ...

  3. snprintf 函数用法

    snprintf()函数用于将格式化的数据写入字符串,其原型为: int snprintf(char *str, int n, char * format [, argument, -]); [参数] ...

  4. linux进程snprintf函数功能,linux 之 snprintf函数用法

    int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...

  5. 881@ snprintf函数使用总结

    一:理论分析 snprintf. 参考案例: https://blog.csdn.net/singledevil0/article/details/126344677?csdn_share_tail= ...

  6. 强化学习(七) - 函数近似方法 - 随机梯度下降, 半梯度下降,及瓦片编码(Tile Coding)实例

    函数近似方法 7.1 目标预测(VE‾\overline{VE}VE) 7.2 随机梯度下降和半梯度下降 例7.1: 1000态随机行走的状态收敛 7.3 线性近似 7.4 线性方法的特征构造 7.4 ...

  7. python replace函数_Python3 replace()函数使用方法

    描述 replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次. 语法replace()方法语法: str.replac ...

  8. SQLserver 常用函数适用方法(转载)

    SQL Server 常用函数使用方法(持续更新) 之前就想要把一些 SQL 的常用函数记录下来,不过一直没有实行...嘿嘿... 直到今天用到substring()这个函数,C# 里面这个方法起始值 ...

  9. python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法

    python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录

最新文章

  1. httpclient高频请求
  2. Android 中的ORM框架
  3. cf1553C. Penalty
  4. STM32——SPI接口
  5. 优化器:torch.optim
  6. 计算机等级和计算应用区别,2020上半年软考问答:计算机等级考试和软考有什么区别?...
  7. 数字金额转化为中文大写
  8. 源码分享:打造「螃蟹火星车」,遥控、拍照、测距,还能做人脸检测;
  9. 华为热设计工程师待遇_【华为热设计工程师面试】华为热设计工程师的笔试经历-看准网...
  10. uni-app银行卡卡号验证
  11. 感冒发烧没想象中可怕:人体自我保护清除体内感染
  12. keepout层导出geber不显示
  13. 张远龙高性能服务器,荆楚匠人:张远龙巧手妙思 葫芦上绘出精彩人生
  14. OpenGL 核心技术之立方体贴图
  15. 马云对话马斯克:福报变成了一周工作12小时?
  16. MYSQL笔试题(考试题)附带答案
  17. 《卓有成效的管理者》——学习心得(六)
  18. IDEA解决开两个窗口问题
  19. python 函数定义 编译_Cython编译的模块不允许访问函数定义的“module”而不是callab...
  20. 手机应用开发的原生app,WEBAPP,混合app的认识

热门文章

  1. SQL语言概述与SQL语言的数据定义
  2. 第5篇:K8S功能架构图 以及全景工作流程图 (初识K8S)
  3. DTS文件详解,DTS文件解析
  4. linux篇(四)linux进程(上)
  5. 如本科技发布超大视野3D工业相机,用于物流、汽车制造大视野拆码垛、搬运场景
  6. 教授专栏06 | 即将进行量子加速,请系紧安全带!
  7. 你会喜欢,最哲理感人的10段话:就算生活给你的是垃圾...
  8. AutoHotKey整理
  9. stm32攻略(随时更新,更新时间:2023.5.5)
  10. PMP课堂模拟题目及解析(第1期)