C++snprintf的使用
一、定义
众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf。自从snprintf代替了sprintf,相信大家对snprintf的使用都不会少,函数定义如下:
int snprintf(char*str, size_t size,constchar*format, ...);
C 库函数 int snprintf(char *str, size_t size, const char *format, ...) 设将可变参数(...),按照 format 格式化成字符串,并将字符串复制到 str 中,size 是要写入的字符的最大数目,超过 size 会被截断。
参数
- str -- 目标字符串。
- size -- 拷贝字节数(Bytes)。
- format -- 格式化成字符串。
- ... -- 可变参数。
返回值
- (1) 如果格式化后的字符串长度小于等于 size,则会把字符串全部复制到 str 中,并给其后添加一个字符串结束符 \0,
- (2) 如果格式化后的字符串长度大于 size,超过 size 的部分会被截断,只将其中的 (size-1) 个字符复制到 str 中,并给其后添加一个字符串结束符 \0,
- (3)返回值为欲写入的字符串长度,若出错则返回负值。
二、实例
int main(){char a[16];size_t i;i = snprintf(a, 13, "%012d", 12345); // 第 1 种情况,12345复制到数组a中printf("i = %lu, a = %s\n", i, a); // 输出:i = 12, a = 000000012345, 12位i = snprintf(a, 9, "%012d", 12345); // 第 2 种情况,超出的截断,只复制1到数组a中printf("i = %lu, a = %s\n", i, a); // 输出:i = 12, a = 00000001,9位return 0;
}
其他例子
std::string printTime(const timeval &tv) {time_t sec_tmp = tv.tv_sec;struct tm *tm = localtime(&sec_tmp);char buf[128];snprintf(buf, sizeof(buf), "%d-%02d-%02d %02d:%02d:%02d.%03d",1900 + tm->tm_year,1 + tm->tm_mon,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,(int)(tv.tv_usec / 1000));return buf;}
另一个例子
假设我想将一个char类型的变量打印成2位的10进制,我应该怎么写呢?
size_t i;char a = 'a';char str[20];i=snprintf(str,sizeof(str), "%02d", a);printf("i = %lu, a = %s\n", i, atr);
运行结果:
解释如下:
size是限定最终生成的dest的字符数,最多拷贝size-1个字符; 一般情况下size会取sizeof(dest),这是为了dest不溢出.
在snprintf(dest, size, "str: %s\n", src)中如果size-1大于等于"str: %s\n"的长度,则把"str: %s\n"都拷贝到dest; 如果size-1小于"str: %s\n"的长度,则从"str: %s\n"拷贝size-1长度的字符串到dst,并且末尾置\0.
就是说,拷贝的长度是size-1和源字符串长度的最小值;
参考:
https://www.cnblogs.com/LifeoFHanLiu/p/10797588.html
https://zhidao.baidu.com/question/681666154238656332.html
https://www.runoob.com/cprogramming/c-function-snprintf.html
C++snprintf的使用相关推荐
- C库函数:scanf、fscanf、printf、fprintf、sprintf、 snprintf
1. scanf 函数原型 int scanf(const char *format, ...); 功能:从标准输入 stdin 读取格式化输入. 2.fscanf 函数原型 int fscanf( ...
- c++ 缓存和缓冲_【嵌入式C】放弃printf,选择了精简snprintf
1.聊一聊 今晚平安夜,记得一定要吃苹果哦!同时提前祝大家圣诞快乐,Merry Christmas! 是一首超级有氛围感的圣诞歌曲,大伙可以听一听,请相信我的品位! 2.正文部分 对于printf相信 ...
- 字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较
问题: 函数memcpy(dest, src, sizeof(dest)).strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), ...
- sprintf,sscanf,snprintf
sprintf:将格式化的数据写入字符串,第一个参数是缓冲区buf.成功返回写字符的总数,失败返回一个负数 1.最简单用法: char str[20]; sprintf(str,"%d&qu ...
- 三个打印函数printf()/sprintf()/snprintf()区别
先贴上其函数原型 printf( const char *format, ...) 格式化输出字符串,默认输出到终端-----stdout sprintf(char *dest, const c ...
- C语言函数 snprintf()(发送有限字符截断字符串输出到 str 所指向的字符串)(字符串拼接、截断拼接)
相似函数: C语言sprintf函数(发送格式化输出到 str 所指向的字符串)(format 标签属性)(字符串拼接) 文章目录 描述 声明 参数 返回值 实例 C 标准库 - <stdio. ...
- 各种输出函数的比较(printf/fprintf/sprintf/snprintf/vprintf/vfprintf/vsprintf/vsnprintf)
对于程序猿来说,printf函数可以说是最熟悉的一个工具了.利用它可以将各类调试信息输出到指定的设备(比如串口)中,实现对程序运行状态的掌控和分析.不过,在实际的应用中,相信大家除了printf函数之 ...
- linux c之snprintf()和sprintf()区别
1.snprintf函数 int snprintf(char *str, size_t size, const char *format, ...); 将可变个参数(...)按照format格式化成字 ...
- 关于sprintf和snprintf的比较
#include <stdio.h> #include <string.h>typedef unsigned char uchar;#define BUF_SIZE 10 // ...
- snprintf函数用法
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...
最新文章
- Centos 下 Nginx 信号控制
- 再学 GDI+[33]: TGPPen - 画笔的几何变换 - SetTransform
- Spring boot配置Dubbo三种方式
- spring系列-注解驱动原理及源码-bean组件注册
- .net core 与ELK(2)安装Elasticsearch可视化工具
- Struts第一个案例搭建
- 2017年2月20日 Random Forest Classifier
- 求数组中的最小子数组,时间复杂度o(n),java
- javaone_JavaOne 2012:使用HTML5和Java构建移动应用程序
- 就知道你会没灵感,感恩节psd分层海报模板来咯!
- 分治法:快排划分法(单向扫描法)
- 64位装32位oracle软件,在64位linux下安装32位oracle软件
- 【线性代数】矩阵的特征值分解(对角化、谱分解)
- _validate_lengths‘ from ‘numpy.lib.arraypad
- Unity单人游戏集合
- Codeforces Round #521 (Div. 3) E. Thematic Contests(dp)
- The COMMIT TRANSACTION request has no corresponding BEGIN
- 香港银行开户多少钱能开下来
- 2:STM32CubeMX配置STM32F103C8T6驱动-TIM1配置
- 老王的电影网站 - 推荐系统入门(一)
热门文章
- 通用后台管理系统前端界面
- 为什么我建议你现在Vue 3?
- python 整行_python dataframe 输出结果整行显示的方法
- DIH-全量导入总结
- POJ_1849 Two
- node.js卸载与重装
- 使用kettle来根据时间戳或者批次号来批量导入数据,达到增量的效果。
- 华擎主板bios设置图解_华擎主板bios设置_华擎主板bios设置图解_asrock主板bios设置...
- 电话号码查询系统(链式结构)
- 用Bibtex导出GB/T 7714等格式引用的方法