C++中sprintf使用的方法与printf的区别分析

本文实例讲述了C++中sprintf使用的方法与printf的区别。分享给大家供大家参考。具体分析如下:

首先我们在MSDN看一下printf的原型和sprintf的原型

代码如下:

int printf( const char *format [, argument]... );

代码如下:

int sprintf( char *buffer, const char *format [, argument] ... );

从定义来看两者的功能其实很相似的。

如果你接触的控制台的程序较多的话,见到printf的比较多,printf函数打印结果到屏幕上,而sprintf函数可以完成其他数据类型转换为字符串。
从以下几点来说明一下

(1)函数的中前两个参数是固定外,可选参数是任意个,buffer是存放字符串指针或者数组名字,fromat是格式化字符串,只要是printf使用的格式化字符串,在sprintf都可以使用,格式化字符串是该函数的精髓。
(2)首先可以把一个整型数据格式化为字符串。比如:

代码如下:

char str[20];
int i_arg = 12345;
sprintf(buf,"%-6d",i_arg);

(3)看一个浮点类型的例子。比如:

代码如下:

char str[20];
double d_arg = 3.1415926;
sprintf(str,"%6.2f",d_arg);

可以控制精度
(4)连接两个字符串,也可以将多个字符串连接起来,%m.n在字符串的输出中,m表示宽度,字符串共占的列数;n表示实际的字符数。%m.n在浮点数中,m也表示宽度,n表示小数的位数。比如:

代码如下:

char dest[256];
char src1[] = {'a','b','c','d','e'};
char src2[] ={'1','2','3','4'};
sprintf(dest,"%.5s%.4s",src1,src2);

也可以动态的截取字符串的某一些字符:

代码如下:

char dest[256];
char src1[] = {'a','b','c','d','e'};
char src2[] ={'1','2','3','4'};
sprintf(dest,"%.*s%.*s",2,src1,3,src2);

也可以窃取浮点类型的有效位

代码如下:

sprintf(str,"%*.*",10,4,d_arg);

补充一点,sprintf的返回值就是字符串的字符的个数,也就是strlen(str)的结果,
也可以打印某个参数的地址

代码如下:

int i=2;
sprintf(str,"%0*x",sizeof(void *),&i);

或者用:

代码如下:

sprintf(str,"%p",&i);

此外这些都是都是多字节类型(ANSI)的函数,而对于unicode类型的应该使用的相似的函数:

代码如下:

int wprintf( const wchar_t *format [, argument]... );
 
int swprintf( wchar_t *buffer, const wchar_t *format [, argument] ... );

用法和上面的很相似的,就是类型不同而已,
对于printf和sprintf该函数的包含在<stdio.h>头文件
而sprintf和wprintf函数包含在<stdio.h>或者<wchar.h>头文件中。

希望本文所述对大家的C++程序设计有所帮助。

(0)

相关推荐

  • echo, print, printf 和 sprintf 区别

    - echo 是命令,不能返回值.echo后面可以跟很多个参数,之间用分号隔开,如:  echo $myvar1;  echo 1,2,$myvar,"bold"; - print 是函数,可以返回一个值,只能有一个参数. - printf 函数,把文字格式化以后输出,如:  $name="hunte";  $age=25;  printf("my name is %s, age %d", $name, $age); - sprintf 跟pri

  • 浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别

    printf语法: #include <stdio.h>int printf( const char *format, ... ); printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数中.返回值是输出的字符数量.sprintf语法: #include <stdio.h>int sprintf( char *buffer, const char *format, ... );sprintf()函数和printf()类似,格式控制完全一样

  • 字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较

    问题:函数memcpy(dest, src, sizeof(dest)).strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), "%s", src)都可以将src字符串中的内容拷贝到dest字符串中.哪一种方式效率最高呢?就是说,哪种方式性能最好呢?解决办法:1. 建立三个文件test_memcpy.c,test_strncpy.c和test_snprintf.c:文件test_memcpy.c: 复制代码 代码如下

  • 基于C语言sprintf函数的深入理解

    printf 可能是许多程序员在开始学习C语言时接触到的 第二个函数(我猜第一个是main),说起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf了解多吗?在将各种类 型的数据构造成字符串时,sprintf的强大功能很少会让你失望.由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出.这也导致sprintf比printf有用得多.所以本文着重介绍sprintf,有时也穿插着用用 pritnf.

  • C语言printf详细解析

     1.类型: 表示输出类型的格式字符 格式字符意义 a                                            浮点数.十六进制数字和p-计数法(C99 A                                            浮点数.十六进制数字和p-计数法(C99)c 输出单个字符d 以十进制形式输出带符号整数(正数不输出符号)e 以指数形式输出单.双精度实数E 以指数形式输出单.双精度实数f   以小数形式输出单.双精度实数 g 以%f%e中较

  • C++中sprintf()函数的使用详解

    在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出.这也导致sprintf 比printf 有用得多.sprintf 是个变参函数,定义如下:int sprintf( char *buffer, const char *format [, argument] ... );除了前两个参数类型固定外,后面可以接任意多个参数.而它的精华,显然就在第二个参

  • strncpy与snprintf 的用法比较

    strncpy的正确用法: strncpy(dest, src, sizeof(dest)):dest[sizeof(dest)-1] = '\0'; snprintf的正确用法:snprintf(dest, sizeof(dest), "%s", src); strncpy的问题:1.size一定要用sizeof(dest)或sizeof(dest)-1,不可误用sizeof(src). 2.手工填0. 务必要把dest的最后一个字节手工设置为0. 因为strncpy仅在src的长度

  • 基于C++中sprintf的错误总结详解

    sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误.下面对sprintf 常出错误问题进行简单的总结: 1.缓冲区溢出:第一个参数的长度太短了,解决办法:将第一个参数的长度扩大.打印字符串时,尽量使用"%.ns"的形式指定最大字符数char buf[5];sprintf(buf, ":%d", 3246);printf("buf is %s\n", buf); 将buf修改为char buf[6]

  • 深入分析C中不安全的sprintf与strcpy

    经过跟踪调试, 发下不少 bug 源于 sprintf 和 strcpy 之类可能造缓冲区溢出的函数. 应该将所有的 sprintf 用 snprintf 替换.将 strcpy 用 strncpy 替换, 并且将末尾字节设置为 ''\0'  . 复制代码 代码如下: strncpy(buf, str, len);buf[len] = 0;

  • C++中sprintf使用的方法与printf的区别分析

    本文实例讲述了C++中sprintf使用的方法与printf的区别.分享给大家供大家参考.具体分析如下: 首先我们在MSDN看一下printf的原型和sprintf的原型 复制代码 代码如下: int printf( const char *format [, argument]... ); 和 复制代码 代码如下: int sprintf( char *buffer, const char *format [, argument] ... ); 从定义来看两者的功能其实很相似的. 如果你接触的

  • VC中CWinThread类以及和createthread API的区别分析

    本文实例讲述了VC中CWinThread类以及和createthread API的区别分析,分享给大家供大家参考.具体分析如下: CWinThread CObject  └CCmdTarget     └CWinThread CWinThread对象代表在一个应用程序内运行的线程.运行的主线程通常由CWinApp的派生类提供:CWinApp由CWinThread派生.另外,CWinThread对象允许一给定的应用程序拥有多个线程. CWinThread支持两种线程类型:工作者线程(Worker

  • JS forEach和map方法的用法与区别分析

    本文实例讲述了JS forEach和map方法的用法与区别.分享给大家供大家参考,具体如下: 一.前言 forEach()和map()两个方法都是ECMA5中Array引进的新方法,主要作用是对数组的每个元素执行一次提供的函数,但是它们之间还是有区别的.jQuery也有一个方法$.each(),长得和forEach()有点像,功能也类似.但是从本质上还是有很大的区别的,那么我们探探究竟. 二.forEach和map语法 2.1.语法: //forEach array.forEach(callba

  • Android中的Dalvik和ART详解及区别分析

    要想知道Dalvik和ART区别分析,首先我们要分别知道这两者是什么? 什么是Dalvik? Dalvik是Google公司自己设计用于Android平台的虚拟机. Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一. 它可以支持已转换为 .dex格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统. Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用

  • javascript中apply和call方法的作用及区别说明

    一.call和apply的说明 1.call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了,这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同. 2.语法:foo.call(this, arg1,arg2,arg3) == foo.apply(this,

  • C#中new的用法及与override的区别分析

    C#中new的用法有三种: (1)new是运算符,用于创建对象和调用构造函数.如Class1=new Class1();也可以为值类型调用默认的构造函数如int a=new int();此时a=0. (2)new是修饰符,用于隐藏基类成员的继承成员.override不能隐藏积累成员的继承成员.如: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace A {

  • jQuery中的.bind()、.live()和.delegate()之间区别分析

    DOM树 首先,可视化一个HMTL文档的DOM树是很有帮助的.一个简单的HTML页面看起来就像是这个样子: 事件冒泡(又称事件传播) 当我们点击一个链接时,其触发了链接元素的单击事件,该事件则引发任何我们已绑定到该元素的单击事件上的函数的执行. 复制代码 代码如下: $('a').bind('click',function(){alert('that tickles!')}) 因此一个单击操作会触发alert函数的执行. click事件接着会向树的根方向传播,广播到父元素,然后接着是每个祖先元素

  • java中重载、覆盖和隐藏三者的区别分析

    重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大  注意:子类实例方法不能覆盖父类的

  • PHP中break及continue两个流程控制指令区别分析

    以下举例说明break 用来跳出目前执行的循环,并不再继续执行循环了. 复制代码 代码如下: <?php $i = 0; while ($i < 7) { if ($arr[$i] == "stop") { break; } $i++; } ?> continue 立即停止目前执行循环,并回到循环的条件判断处,继续下一个循环. 复制代码 代码如下: <?php while (list($key,$value) = each($arr)) { if ($key =

  • PHP中删除变量时unset()和null的区别分析

    第一种方法:$varname=null 第二种方法:unset($varname) 这两种方法都可以删除变量,但结果有些许的差别. 代码: 复制代码 代码如下: <?php $a = array( 'a' => 'a', 'b' => 'b' ); $b = array( 'a' => 'a', 'b' => 'b' ); $a['b'] = null; unset($b['b']); print('<pre>'); print_r($a); print('<

随机推荐