转自:http://blog.csdn.net/anye3000/article/details/6593551

有C语言写作历史的程序员往往特别喜欢printf 函数。即使可以使用更简单的命令(例如puts),但printf 出现在Kernighan和Ritchie的「hello, world」程序中一点也不会令人惊奇。我们知道,增强后的「hello, world」最终还是需要printf 的格式化输出,因此我们最好从头开始就使用它。

但有个坏消息:在Windows程序中不能使用printf。虽然Windows程序中可以使用大多数C的执行时期函数库。实际上,许多程式写作者更愿意使用C的内存管理和I/O函数而不是Windows中等效的函数-Windows对标准输入和标准输出没有概念。在Windows程序中可使用fprintf,而不是printf。

还有一个好消息,那就是仍然可以使用sprintf 及sprintf 系列中的其他函数来显示文字。这些函数除了将内容格式化输出到第一个参数所提供的字符串缓冲区以外,其功能与printf 相同。然后便可对该字符串进行操作(例如将其传给MessageBox)。

如果您从未使用过sprintf (我第一次开始写Windows程序时也没用过此函数),这里有一个简短的执行实体。

printf 函数说明如下:

int printf (const char * szFormat, ...);
第一个参数是一个格式化字符串,后面是与格式化字符串中的代码相对应的不同类型多个参数。

sprintf 函数定义如下:

int sprintf (char * szBuffer, const char * szFormat, ...);
第一个参数是字符串缓冲区,后面是一个格式字串。sprintf不是将格式化结果标准输出,而是将其存入szBuffer。该函数返回该字符串的长度。

在命令行程序中,

printf ("The sum of %i and %i is %i", 5, 3, 5+3) ;
的功能相同于

char szBuffer [100] ;
sprintf (szBuffer, "The sum of %i and %i is %i", 5, 3, 5+3) ;
puts (szBuffer) ;
在Windows中,使用MessageBox显示结果优于puts。

几乎每个人都经历过,当格式化字符串与被格式化的变数不合时,可能使printf 执行错误并可能造成程序当掉。使用sprintf 时,您不但要担心这些,而且还有一个新的负担:您定义的字符串缓冲区必须足够大以存放结果。Microsoft 专用函数_snprintf 解决了这一问题,此函数引进了另一个参数,表示以字节计算的缓冲区大小。

vsprintf 函数定义如下:

int vsprintf(char *string, char *format, va_list param);

vsprintf 是sprintf 的一个变形,它只有三个参数。vsprintf 用于执行有不定数量参数的函数,类似printf 格式。vsprintf的前两个参数与sprintf相同:一个用于保存结果的字符串缓冲区和一个格式化字符串。第三个参数是指向格式化参数队列的指针。实际上,该指针指向在堆栈中供函数调用的变量。va_list、va_start和va_end宏(在STDARG.H中定义)帮助我们处理堆栈指针。本章最后的SCRNSIZE程式展示了使用这些宏的方法。使用vsprintf 函数,sprintf 函数可以这样编写:

int sprintf (char * szBuffer, const char * szFormat, ...)
{
int     iReturn ;
va_list pArgs ;
va_start (pArgs, szFormat) ;
iReturn = vsprintf (szBuffer, szFormat, pArgs) ;
va_end (pArgs) ;
return iReturn ;
}
va_start宏将pArg设置为指向一个堆栈变量,该变量位址在堆栈参数szFormat的上面。

由於许多Windows早期程序使用了sprintf 和vsprintf,最终导致Microsoft 向Windows API中增添了两个相似的函数。Windows的wsprintf 和wvsprintf 函数在功能上与sprintf 和vsprintf 相同,但它们不能处理浮点格式。

当然,随著宽字符的发表,sprintf 类型的函数增加了许多,使得函数名称变得极为混乱。下面列出了Microsoft 的C执行时期函数库和Windows支持的所有sprintf 函数。

ASCII 宽字符 常规 
参数的变量个数       
标准版 sprintf swprintf _stprintf 
最大长度版 _snprintf _snwprintf _sntprintf 
Windows版 wsprintfA wsprintfW wsprintf

参数队列的指针        
标准版 vsprintf vswprintf _vstprintf 
最大长度版 _vsnprintf _vsnwprintf _vsntprintf 
Windows版 wvsprintfA wvsprintfW wvsprintf

在宽字符版的sprintf 函数中,将字符串缓冲区定义为宽字符串。在宽字符版的所有这些函数中,格式化字符串必须是宽字符串。不过,您必须确保传递给这些函数的其他字符串也必须由宽字符组成。

printf,sprintf,vsprintf 区别【转】的更多相关文章

  1. printf,sprintf,vsprintf

    printf,sprintf比较常用,vsprintf不常用. 1. 三个函数的声明: int printf (const char * szFormat, ...); int sprintf (ch ...

  2. PHP输出函数print, printf, sprintf的区别

    PHP中常用的字符串输出方式是:使用echo和print两种方法来显示字符串.如果涉及格式化输出操作,还可以试用printf和sprintf函数. 一.先说echo和print两种方法 print的语 ...

  3. php中sprintf与printf函数用法区别

    下面是一个示例:四舍五入保留小数点后两位  代码如下 复制代码 <?php$num1 = 21;echo sprintf("%0.2f",$num1)."<b ...

  4. printf,sprintf,fprintf的区别与联系

    在写代码过程中总会遇到printf和sprintf,既然这两个都遇到了,那么不妨再加一个fprintf吧. 他们三个都是将格式化字符串输出,区别就是他们输出的目标不一样. (1).printf,是把格 ...

  5. C语言之linux内核可变参实现printf,sprintf

    昨天,我发表了一篇用可变参实现的fprintf函数,其实说实话还不完全是可变参实现的,因为用到了FILE * 这样的指针,需要包含stdio.h这个头文件才能实现这个函数,今天我们就来看看,如何抛弃s ...

  6. C/C++ scanf和gets 区别 , printf和puts区别

    ref 1. scanf和gets区别 | 博客园 2. printf和puts区别 | CSDN scanf和gets都能从输入流stdin读取字符串,那么它们有什么区别呢? scanf 留回车:开 ...

  7. PHP字符串函数之 sscanf echo print sprintf vsprintf printf vprintf fprintf vfprintf

    sscanf – 根据指定格式解析输入的字符 echo – 输出一个或多个字符串 print – 输出字符串 sprintf – 返回格式化字符串 vsprintf – 返回格式化字符串 (参数为数组 ...

  8. [转]PHP echo, print, printf, sprintf函数的区别和使用

    1. echo函数: 输出函数,是命令,不能返回值.echo后面可以跟很多个参数,之间用分号隔开,如: echo $myvar1; echo 1,2,$myvar,"<b>bol ...

  9. PHP echo, print, printf, sprintf函数的区别和使用

    1. echo函数: 输出函数,是命令,不能返回值.echo后面可以跟很多个参数,之间用分号隔开,如: echo $myvar1; echo 1,2,$myvar,"<b>bol ...

随机推荐

  1. ant简述

    1,什么是antant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台   --因为 ...

  2. 楼市、股市后下一届ZF将用什么去做超发货币的蓄水池(

    这是天涯论坛上最近的的一个热帖合集,周小川曾直言超发货币需要蓄水池来装,以控制通货膨胀.这个蓄水池楼市做过.股市曾经也充当过,或许现在的地下钱庄也算一部分吧,那下一届政府会如何选择这个蓄水池呢,这或将 ...

  3. .net平台下深拷贝和浅拷贝

    在.net类库中,对象克隆广泛存在于各种类型的实现中,凡是实现了ICloneable接口的类型都具备克隆其对象实例的能力.所以本文讲述的深拷贝和浅拷贝也是在实现ICloneable接口的基础上进行的. ...

  4. 第二篇 Integration Services:SSIS数据泵

    本篇文章是Integration Services系列的第二篇,详细内容请参考原文. 简介SSIS用于移动数据.数据流任务提供此功能.因为这个原因,当介绍SSIS时我喜欢从数据流任务开始.数据流任务的 ...

  5. Swift实战-豆瓣电台(三)获取网络数据

    观看地址:http://v.youku.com/v_show/id_XNzMwMzQxMzky.html 这节内容,我们先说了怎么将storyboard中的组件在类中进行绑定.然后写了一个类用来获取网 ...

  6. ads 错误

    这个问题已经不是第一次碰到了,每次弄周立功的EasyARM2210的时候都会遇见,每次都没有记住.就是要用ADS运行板子配套光盘里面的配套程序的时候会出现: (Fatal)L6002U:Could n ...

  7. csuoj 1335: 高桥和低桥

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1335 1335: 高桥和低桥 Time Limit: 1 Sec  Memory Limit: 1 ...

  8. sort 树 hash 排序

    STL 中 sort 函数用法简介 做 ACM 题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的 O(n^2) 排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错. ST ...

  9. ubuntu安装jdk遇到的问题:cannot execute binary file

    安装完jdk,配置好环境变量出现如下状况: cannot execute binary file 问题原因: jdk的位数与ubuntu的系统位数不一致 jdk 64位 ubuntu 32位 然后通过 ...

  10. CCF真题之门禁系统

    201412-1 问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况.每位读者有一个编号,每条记录用读者的编号来表示.给出读者的来访记录,请问每一条记录中的读者是第几次出现. 输入 ...