snprintf()函数使用方法
众所周知,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()函数使用方法相关推荐
- sprintf函数、snprintf函数、asprintf函数、vsprintf
sprintf函数: 功能 把格式化的数据写入某个字符串缓冲区. 头文件 stdio.h 原型 int sprintf( char *buffer, const char *format, [ arg ...
- [C++]snprintf函数
snprintf()函数用于将格式化的数据写入字符串,其原型为: int snprintf(char *str, int n, char * format [, argument, ...]) ...
- snprintf 函数用法
snprintf()函数用于将格式化的数据写入字符串,其原型为: int snprintf(char *str, int n, char * format [, argument, -]); [参数] ...
- linux进程snprintf函数功能,linux 之 snprintf函数用法
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...
- 881@ snprintf函数使用总结
一:理论分析 snprintf. 参考案例: https://blog.csdn.net/singledevil0/article/details/126344677?csdn_share_tail= ...
- 强化学习(七) - 函数近似方法 - 随机梯度下降, 半梯度下降,及瓦片编码(Tile Coding)实例
函数近似方法 7.1 目标预测(VE‾\overline{VE}VE) 7.2 随机梯度下降和半梯度下降 例7.1: 1000态随机行走的状态收敛 7.3 线性近似 7.4 线性方法的特征构造 7.4 ...
- python replace函数_Python3 replace()函数使用方法
描述 replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次. 语法replace()方法语法: str.replac ...
- SQLserver 常用函数适用方法(转载)
SQL Server 常用函数使用方法(持续更新) 之前就想要把一些 SQL 的常用函数记录下来,不过一直没有实行...嘿嘿... 直到今天用到substring()这个函数,C# 里面这个方法起始值 ...
- python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法
python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录
最新文章
- httpclient高频请求
- Android 中的ORM框架
- cf1553C. Penalty
- STM32——SPI接口
- 优化器:torch.optim
- 计算机等级和计算应用区别,2020上半年软考问答:计算机等级考试和软考有什么区别?...
- 数字金额转化为中文大写
- 源码分享:打造「螃蟹火星车」,遥控、拍照、测距,还能做人脸检测;
- 华为热设计工程师待遇_【华为热设计工程师面试】华为热设计工程师的笔试经历-看准网...
- uni-app银行卡卡号验证
- 感冒发烧没想象中可怕:人体自我保护清除体内感染
- keepout层导出geber不显示
- 张远龙高性能服务器,荆楚匠人:张远龙巧手妙思 葫芦上绘出精彩人生
- OpenGL 核心技术之立方体贴图
- 马云对话马斯克:福报变成了一周工作12小时?
- MYSQL笔试题(考试题)附带答案
- 《卓有成效的管理者》——学习心得(六)
- IDEA解决开两个窗口问题
- python 函数定义 编译_Cython编译的模块不允许访问函数定义的“module”而不是callab...
- 手机应用开发的原生app,WEBAPP,混合app的认识
热门文章
- SQL语言概述与SQL语言的数据定义
- 第5篇:K8S功能架构图 以及全景工作流程图 (初识K8S)
- DTS文件详解,DTS文件解析
- linux篇(四)linux进程(上)
- 如本科技发布超大视野3D工业相机,用于物流、汽车制造大视野拆码垛、搬运场景
- 教授专栏06 | 即将进行量子加速,请系紧安全带!
- 你会喜欢,最哲理感人的10段话:就算生活给你的是垃圾...
- AutoHotKey整理
- stm32攻略(随时更新,更新时间:2023.5.5)
- PMP课堂模拟题目及解析(第1期)