c语言printf、sprintf、vsprintf用法和区别
printf、sprintf、vsprintf 通常用于格式化字符串,通俗来说就是字符串打印或显示格式转换。
printf、sprintf 需要包含 <stdio.h> 头文件,vsprintf 需要包含 <stdarg.h>。
使用下面例程,介绍他们的用法、区别和关系。
我的VS2019在运行c程序时候出现点小问题,提示函数非安全。需要使用 sprintf_s、vsprintf_s。
替换后,实验结果有一些不对劲。换了下平台,在树莓派上编译运行,结果正常。以下实验现象均为树莓派运行输出。
使用 printf、sprintf、vsprintf 分别输出 a、b 的值。
printf
#include <stdio.h>int main(int argc, char* argv)
{int a = 10,b = 20;printf("a=%d,b=%d\r\n", a, b);return 0;
}
------------------------------------------------------------------
a=10,b=20
实际运行现象:
printf最为简单,只需要添加字符串,和%格式说明,即可输出用户内容。
sprintf
#include <stdio.h>int main(int argc, char* argv)
{char str[20];int a = 20,b = 20;sprintf(str, "a=%d,b=%d\r\n", a, b);printf(str);return 0;
}
-------------------------------------------------------------------
a=20,b=20
实际运行现象:
sprintf :发送格式化输出到指定数组。格式化用法与 printf一致,相当于把 printf输出的内容放入指定数组中
vsprintf
#include <stdio.h>
#include <stdarg.h>void myPrintf(char* fmt, ...)
{char str[20];va_list ap;va_start(ap, fmt);vsprintf(str, fmt, ap);va_end(ap);printf(str);
}int main(int argc, char* argv)
{int a = 30,b = 20;myPrintf("a=%d,b=%d\r\n", a, b);return 0;
}
-------------------------------------------------------------------
a=30,b=20
实际运行现象:
vsprintf使用不确定参数的方式封装,可直接输入数组和未知的参数。从而精简 sprintf需要先创建数组再传入参数的操作。
vsprintf 与 sprintf 功能相似,都是将格式化内容输出到指定数组。不同的是使用方法和用途有些不一样。
看过上面的例程,有没有感觉 sprintf 也能替换 vsprintf,实现相同的功能,何必搞出 va_list、va_end 一堆的麻烦事???
那么就来试着替换一下。(实际这种用法是错误的)
#include <stdio.h>void myPrintf(char* fmt, ...)
{char str[20];sprintf(str, fmt);printf(str);
}int main(int argc, char* argv)
{int a = 30,b = 20;myPrintf("a=%d,b=%d\r\n", a, b);return 0;
}
-------------------------------------------------------------------
a=20,b=2125550836
实际运行现象:
欸!!!有趣的来了,这tm输出的完全不对啊,我输入的明明是30和20,输出的是20和2125550836。
所以 sprintf 不适用于这种封装的传参,sprintf不能以不确定传参的方式来格式参数。
而 va_start(ap,fmt) 从实现方式来讲,它使va_list类型变量ap指向被传递给函数的可变参数表中的第一个参数,然后在栈中浏览参数,最后由于va_end(ap)释放掉ap。
最后总结:对于传参中参数类型和个数不确定的格式转换,请使用 vsprintf。
c语言printf、sprintf、vsprintf用法和区别相关推荐
- printf,sprintf,vsprintf 区别【转】
转自:http://blog.csdn.net/anye3000/article/details/6593551 有C语言写作历史的程序员往往特别喜欢printf 函数.即使可以使用更简单的命令(例如 ...
- Java学习笔记1:Java中有关print、println、printf的用法和区别
Java学习笔记1:Java中有关print.println.printf的用法和区别 最近在学习java,写一些笔记记录下. 1.print()函数是一般的标准输出,但是不换行. 2.println ...
- C语言中的格式化打印printf/sprintf以及嵌入式printf重定向进行DEBUG
一.printf描述 在C语言中,打印函数主要包括printf/sprintf/fprintf/snprintf等等,目的是将"给定的内容"按照"指定的格式"输 ...
- PHP中MySQL、MySQLi和PDO的用法和区别
MySQL 是 PHP 操作 MySQL 数据库最原始的 Extension.MySQLi 的 i 代表 Improvement ,提供了相对进阶的功能,就 Extension 而言,本身也增加了安全 ...
- 武林c语言,c语言printf函数的使用
看C语言程序的时候,往往会遇到printf函数输出,在此,武林小编我就总结一下c语言printf函数的使用,本文对c语言中printf函数的使用进行了详细的分析介绍,需要的朋友参考下. printf的 ...
- sprintf()和itoa()的区别
引题 博主对sprintf()和itoa()两者区别的关注要从PAT Basic Level 1002题说起.PAT是Programming Ability Test(PAT,编程能力考试),该网站提 ...
- C语言printf函数详解
本文已整合到C语言标准库深度解读 printf是绝大多数人接触的第一个C语言函数,但绝大多数人对printf的认识也就到了hello world为止了,很多人甚至看不懂这个函数的声明: int pri ...
- printf, sprintf - 转换成指定格式的输出结果.
名称: printf, sprintf - 转换成指定格式的输出结果. 语法: void printf( string format, ... ); string sprintf( string fo ...
- C语言 printf 函数 - C语言零基础入门教程
目录 一.printf 函数简介 二.C 语言格式符/占位符 三.printf 函数实战 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 ...
最新文章
- 4、kubernetes 集群管理工具 kubectl
- 【c语言】2020蓝桥杯校内模拟赛c组
- APL开发日志--2012-11-26
- SAP SD 定价过程的16个字段的作用说明
- HBase运维基础——元数据逆向修复原理
- php的date比较时间差,php date 时间差
- Springboot项目中static文件和templates文件的区别
- “质量总监成长记”读后感
- 小a的旅行计划(BM模板)
- java调用平方函数_java中的数学计算函数的总结
- 春秋·左丘明-《左传·成公八年》
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计
- 【kafka】Kafka 可视化工具Kafka Eagle安装和使用
- EXCEL中的计算机视觉(1)——excel中的图像可视化
- linux conforming code segment nonconforming code segment
- 容联AI获AIIA智能客服最高等级认证
- HarmonyOS系统中内核实现NFC无线通信的方法
- 本科+研究生七年之痒,我的经历希望能给你启发和坚持
- DAPI溶液|CAS:28718-90-34’,6-二脒基-2-苯基吲哚二盐酸盐
- Sentinel微服务流量控制熔断降级及稳定性监控IO框架
热门文章
- Akka-CQRS(2)- 安装部署cassandra cluster,ubuntu-16.04.1-LTS and MacOS mojave
- canvas绘制渐变
- 怎样给 ActiveX 控件签名并打包发布
- 江苏大学考研885程序设计 - 填空选择知识点
- 《Algorithms》Comparable 实现希尔排序
- 高考语文再现奇葩作文题!大数据分析高考作文,看看哪年最坑爹?
- render_notebook()结果没有图_数与图(20)——机器学习.下
- FISSA:融合项目相似度模型和自注意网络的时序推荐
- linux清除asm磁盘分区,ASM Diskgroup添加与删除
- java 线程 listview_android使用Thread实现json数据的传递,并且使用ListView显示