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用法和区别相关推荐

  1. printf,sprintf,vsprintf 区别【转】

    转自:http://blog.csdn.net/anye3000/article/details/6593551 有C语言写作历史的程序员往往特别喜欢printf 函数.即使可以使用更简单的命令(例如 ...

  2. Java学习笔记1:Java中有关print、println、printf的用法和区别

    Java学习笔记1:Java中有关print.println.printf的用法和区别 最近在学习java,写一些笔记记录下. 1.print()函数是一般的标准输出,但是不换行. 2.println ...

  3. C语言中的格式化打印printf/sprintf以及嵌入式printf重定向进行DEBUG

    一.printf描述 在C语言中,打印函数主要包括printf/sprintf/fprintf/snprintf等等,目的是将"给定的内容"按照"指定的格式"输 ...

  4. PHP中MySQL、MySQLi和PDO的用法和区别

    MySQL 是 PHP 操作 MySQL 数据库最原始的 Extension.MySQLi 的 i 代表 Improvement ,提供了相对进阶的功能,就 Extension 而言,本身也增加了安全 ...

  5. 武林c语言,c语言printf函数的使用

    看C语言程序的时候,往往会遇到printf函数输出,在此,武林小编我就总结一下c语言printf函数的使用,本文对c语言中printf函数的使用进行了详细的分析介绍,需要的朋友参考下. printf的 ...

  6. sprintf()和itoa()的区别

    引题 博主对sprintf()和itoa()两者区别的关注要从PAT Basic Level 1002题说起.PAT是Programming Ability Test(PAT,编程能力考试),该网站提 ...

  7. C语言printf函数详解

    本文已整合到C语言标准库深度解读 printf是绝大多数人接触的第一个C语言函数,但绝大多数人对printf的认识也就到了hello world为止了,很多人甚至看不懂这个函数的声明: int pri ...

  8. printf, sprintf - 转换成指定格式的输出结果.

    名称: printf, sprintf - 转换成指定格式的输出结果. 语法: void printf( string format, ... ); string sprintf( string fo ...

  9. C语言 printf 函数 - C语言零基础入门教程

    目录 一.printf 函数简介 二.C 语言格式符/占位符 三.printf 函数实战 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 ...

最新文章

  1. 4、kubernetes 集群管理工具 kubectl
  2. 【c语言】2020蓝桥杯校内模拟赛c组
  3. APL开发日志--2012-11-26
  4. SAP SD 定价过程的16个字段的作用说明
  5. HBase运维基础——元数据逆向修复原理
  6. php的date比较时间差,php date 时间差
  7. Springboot项目中static文件和templates文件的区别
  8. “质量总监成长记”读后感
  9. 小a的旅行计划(BM模板)
  10. java调用平方函数_java中的数学计算函数的总结
  11. 春秋·左丘明-《左传·成公八年》
  12. 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计
  13. 【kafka】Kafka 可视化工具Kafka Eagle安装和使用
  14. EXCEL中的计算机视觉(1)——excel中的图像可视化
  15. linux conforming code segment nonconforming code segment
  16. 容联AI获AIIA智能客服最高等级认证
  17. HarmonyOS系统中内核实现NFC无线通信的方法
  18. 本科+研究生七年之痒,我的经历希望能给你启发和坚持
  19. DAPI溶液|CAS:28718-90-34’,6-二脒基-2-苯基吲哚二盐酸盐
  20. Sentinel微服务流量控制熔断降级及稳定性监控IO框架

热门文章

  1. Akka-CQRS(2)- 安装部署cassandra cluster,ubuntu-16.04.1-LTS and MacOS mojave
  2. canvas绘制渐变
  3. 怎样给 ActiveX 控件签名并打包发布
  4. 江苏大学考研885程序设计 - 填空选择知识点
  5. 《Algorithms》Comparable 实现希尔排序
  6. 高考语文再现奇葩作文题!大数据分析高考作文,看看哪年最坑爹?
  7. render_notebook()结果没有图_数与图(20)——机器学习.下
  8. FISSA:融合项目相似度模型和自注意网络的时序推荐
  9. linux清除asm磁盘分区,ASM Diskgroup添加与删除
  10. java 线程 listview_android使用Thread实现json数据的传递,并且使用ListView显示