snprintf vs sprintf
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int dprintf(int fd, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vdprintf(int fd, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
int snprintf(char *str, size_t n, const char *format, ...);
函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0,总共拷贝n个字符。
snprintf的返回值是欲写入的字符串长度,而不是实际写入的字符串度。
一、验证存入结果:
#include<stdio.h>
#define BUFSIZE 9
void init_buf(char *buf, size_t size);
void print_buf(char *buf);
int main(){
char buf[BUFSIZE];
init_buf(buf, BUFSIZE);
print_buf(buf);
// hello there! == 12 characters, > BUFSIZE
init_buf(buf, BUFSIZE);
snprintf(buf, BUFSIZE, "hello there!");
print_buf(buf);
// turtle == 6 charaters, < BUFSIZE
init_buf(buf, BUFSIZE);
snprintf(buf, BUFSIZE, "turtle");
print_buf(buf);
// 2222220 == 7 charaters, > 5
init_buf(buf, BUFSIZE);
snprintf(buf, 5, "%d", 222222 * 10);
print_buf(buf);
return 0;
}
void init_buf(char *buf, size_t size)
{
int i;
for(i=0; i<size; i++){
buf[i] = i + '0'; // int to char conversion
}
}
void print_buf(char *buf)
{
int i;
char c;
for(i=0; i<BUFSIZE; i++){
c = buf[i];
if(c == '\0'){
printf("\\0");
}
else{
printf("%c", buf[i]);
}
}
printf("\n");
}
The output:
012345678
hello th\0
turtle\078
2222\05678
二、验证返回结果:
char test[8];
int ret = snprintf(test,5,"1234567890");
printf("%d|%s/n",ret,test);
运行结果为:
10|1234
#include<stdio.h>
#define BUFSIZE 10
int main(){
char buf[BUFSIZE];
if(snprintf(buf, BUFSIZE, "hello") >= BUFSIZE){
printf("%s\n", buf);
}
if(snprintf(buf, BUFSIZE, "An extremely long string") >= BUFSIZE){
printf("buf: %s\n", buf);
}
if(snprintf(buf, BUFSIZE, "0%d", 123456789) >= BUFSIZE){
printf("buf: %s\n", buf);
}
return 0;
}
The output:
buf: An extrem
buf: 012345678
三、应用:
#include<stdio.h>
#include<stdlib.h>
int main(){
int bufSize = 10;
char *mystr = "This is my string!";
char *buf = malloc(bufSize);
if(snprintf(buf, bufSize, "%s", mystr) >= bufSize){
bufSize *= 2;
printf("Not enough space. Trying %d bytes\n", bufSize);
free(buf);
buf = malloc(bufSize);
if(snprintf(buf, bufSize, "%s", mystr) >= bufSize){
printf("Still not enough space. Aborting\n");
exit(1);
}
}
printf("There was enough space!\n");
printf("buf: %s\n", buf);
return 0;
}
The output:
Not enough space. Trying 20 bytes
There was enough space!
buf: This is my string!
int sprintf(char *str, const char *format, ...)
将字符串写入str中,格式为format,不检查是否会溢出
例如:
sprintf(s, "%d", 123); //把整数123打印成一个字符串保存在s中
sprintf(s, "%8x", 4567); //小写16进制,宽度占8个位置,右对齐
#include <stdio.h>#include <math.h>
int main(){
char str[80];
sprintf(str, "Value of Pi = %f", M_PI);
puts(str);
return(0);
}
The answer is :
Value of Pi = 3.141593
snprintf vs sprintf的更多相关文章
- snprintf和sprintf区别分析
目录[-] snprintf函数的返回值 snprintf函数的字符串缓冲 今天在项目中使用snprintf时遇到一个比较迷惑的问题,追根溯源了一下,在此对sprintf和snprintf进行一下对比 ...
- 转:sprintf与snprintf
sprintf与snprintf int sprintf( char *buffer, const char *format [, argument] ... ); 除了前两个参数类型固定外,后面 ...
- [misc]printf/fprintf/sprintf/snprintf函数
转自:http://blog.csdn.net/To_Be_IT_1/article/details/32179549 需要包含的头文件 #include <stdio.h> int pr ...
- sprintf,snprintf的用法(可以作为linux中itoa函数的补充)【转】
转自:http://blog.csdn.net/educast/article/details/25068445 函数功能:把格式化的数据写入某个字符串 头文件:stdio.h 函数原型:int sp ...
- C中不安全函数
C 中大多数缓冲区溢出问题可以直接追溯到标准 C 库.最有害的罪魁祸首是不进行自变量检查的.有问题的字符串操作(strcpy.strcat.sprintf 和 gets).一般来讲,象“避免使用 st ...
- 华为C语言编程规范
DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...
- c语言输入与输出库函数#include<stdio.h>
last modified: 2010-05-28 输入与输出<stdio.h> 头文件<stdio.h>定义了用于输入和输出的函数.类型和宏.最重要的类型是用于声明文件指针的 ...
- QT开发pjsip的VOIP,A8平台运行
QT开发pjsip的VOIP 开发环境 平台:A8 环境:Linux-3.0.8 实现功能:使用QT开发VOIP进行初始化.拨号.挂起 测试工具:minisipserver服务器 效果 界面: min ...
- 【安全开发】C/C++安全编码规范
C本质上是不安全的编程语言.例如如果不谨慎使用的话,其大多数标准的字符串库函数有可能被用来进行缓冲区攻击或者格式字符串攻击.但是,由于其灵活性.快速和相对容易掌握,它是一个广泛使用的编程语言.下面是针 ...
随机推荐
- MongoDB数据库 : 管道,用户管理,副本集等
聚合(aggregate): db.集合.aggregate([{管道:{表达式}}]) db.集合.aggregate([ {管道1:{表达式1}}, {管道2:{表达式2}}, ... ...]) ...
- PHP Ajax跨域问题解决办法
在项目开发中,经常会遇到跨域访问资源,上传图片等,那么这些都怎么解决呢,下面简单介绍一下ajax请求时,解决跨域问题. 原文地址:小时刻个人博客 > http://small.aiweimeng ...
- 【七】ab压测
[任务7]ab压测 安装ab压测软件 命令:yum -y install httpd-tools 进行压力测试: 执行命令:ab -c 20 -n 5000 http://192.168.159.30 ...
- D3.js和three.js
D3.js是一个数据可视化的库,看看他们的DEMO就可以知道,技术基础是SVG.兼容性是IE9+. three.js是以webgl为基础的库,封装了一些3D渲染需求中重要的工具方法与渲染循环.
- 20155204 2016-2017-2 《Java程序设计》第3周学习总结
20155204 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 一个原始码中可以有多个类定义,但只能有一个公开类. 留心Scanner对于每一种类型的nex ...
- 通过unixODBC访问PostgreSQL数据库
磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页[作者 高健@博客园 luckyjackgao@g ...
- 北京Uber优步司机奖励政策(4月10日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- OpenCV中Mat的属性
OpenCV中Mat的属性 最近在做一OpenCV的图像轮廓检验,但当用到霍夫变换时才发现对Mat的属性了解不足.Mat在OpenCV中的地位是及其重要的,因此有必要做一个总结. 大体上来说,Mat是 ...
- gitlab在push代码的时候报错
一.问题报错 gitlab在执行git pull origin master,拉取代码的时候报如下错误. $ git pull origin master remote: Counting objec ...
- Nginx入门篇(五)之LNMP环境应用
一.LNMP组合工作原理 (1)用户通过浏览器输入域名请求Nginx web服务: (2)Nginx对请求的资源进行判断,如果是静态资源,则由Nginx返回给用户:如果是动态请求(.php文件),那么 ...