printf和sprintf的区别

一、printf和sprintf的区别
sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。


二、sprintf的使用详解
1、该函数包含在stdio.h的头文件中。
2、sprintf函数的格式:
int sprintf( char *buffer, const char *format [, argument,...] );
除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串(像:"%3d%6.2f%#x%o",%与#合用时,自动在十六进制数前面加上0x)。只要在printf中可以使用的格式化字符串,在sprintf都可以使用。其中的格式化字符串是此函数的精华。
3、sprintf函数打印到字符串中(可用于完成其他数据类型转换成字符串和字符串拼接)。

例如:
3.1 将基本数据类型转换成字符串
int i=10;
char str1[5];
sprintf(str1,"%d",i);
printf("str1=%s\n",str1);//str=10

3.2 可以控制精度
char str2[20];
double f=14.309948;
sprintf(str2,"%6.2f",f);
printf("str2=%s\n",str2);//str2=14.31

3.3 可以将多个基本数据类型拼接
char str[20];
int a=20984,b=48090;
sprintf(str,"%3d%6d",a,b);//str[]="20984 48090"
sprintf(str,"%3d%5d",a,b);//str[]="2098448090"
注意:最小输出宽度:
(1)用十进制整数来表示输出的最少位数。(至多要输出这么多位!)
(2)若实践位数多于界说的宽度:则按实践位数输出。
(3)若实践位数少于界说的宽度:a.则右对齐,左边留空。
b.有负号,左对齐,右边留空
c.表示宽度的数字以0开端,则右对齐,左边留空。
3.4 基本数据类型和字符串拼接在一块
int a=500;
char str1[]="世界";
char str2[]="强";
char str[20];
sprintf(str,"%s%d%s\n",str1,a,str2);
printf("str=%s\n",str);//str=“世界500强”

3.5 字符串和字符串拼接在一块
char str1[20];
memset(str1,0,20);//清空数据
//char s1[]={'A','B','C'};
//char s2[]={'D','E','F'};
char s1[5]="ABC";
char s2[5]="DEF";
sprintf(str1,"%.3s%.3s",s1,s2);
printf("str1=%s",str1); //str1=ABCDEF
注意:
(1) %m.n在字符串的输出中,m表示宽度,字符串共占的列数;n表示实际的字符数。
(2) %m.n在浮点数中,m也表示宽度;n表示小数的位数

3.6 字符串拼接(可以将多个任意大小的字符串拼接在一起存放在另一个字符串中)
注意:strlen():计算字符串实际的占字节大小
sizeof():计算字符串实际的占字节数+空字节“\0”
例如:
char str1[]="世界";
int i1=sizeof(str1);
printf("i1=%d\n",i1);//i1=5(两个汉字占四个字节+一个空字节)
int i2=strlen(str1);
printf("i2=%d\n",i2);i2=4(两个汉字占四个字节)

实例:
char str1[]="世界你好";
char str2[]="hello world";
char str3[]="上海欢迎您";

     int len=strlen(str1)+strlen(str2)+strlen(str3)+1;
     int lens=sizeof(str1)+sizeof(str2)+sizeof(str3)-2;    
      printf("len=%d lens=%d\n",len,lens);//30

    char *str=(char*)malloc(len);//开辟一块空间
    sprintf(str,"%s%s%s\n",str1,str2,str3);
    注意:开辟一块空间后并赋值后,length()是指针指向的内容占得字节数; sizeof()是这个空间指所占得的字节数(一个指针占4个字节)
    int leng=sizeof(str);
    int leng1=strlen(str);
    printf("%d %d %s\n",leng,leng1,str);//4 30 世界你好hello world"上海欢迎您
    
    free(str);//只是清空了str指向地址的内容,地址空间并没有释放,然后需要再        str=NULL;地址空间才会释放。

3.7、可以动态指定,需要截取的字符数
char str1[20];
//char s1[]={'A','B','C'};
//char s2[]={'D','E','F'};
char s1[]="ABC";
char s2[]="DEF";
sprintf(str1,"%.s%.s",2,s1,3,s2);//注意这里的2和3
printf("%s\n",str1);//ABDEF

  char str2[20];
  sprintf(str2,"%*.*f", 10, 2, 3.1415926);
  //10:最小输出宽度(若实践位数少于界说的宽度,则右对齐,左边留空);  2:保留小数点后两位
  printf("%s\n",str2);//           3.14

3.8、可以打印出i的地址
int i=10;
char s[30];
sprintf(s, "%p", &i);
printf("%s",s);
上面的语句相当于
sprintf(s, "%0*x", 2 * sizeof(void *), &i);

3.9、sprintf的返回值是字符数组中字符的个数,即字符串的长度,不用在调用strlen(s)求字符串的长度。
实例:
sprintf(szTemp,"MYSQL>>>连接数据库失败(%s)\n",mysql_error(&m_mysql));


三、printf的使用详解
功能:printf()函数是式样化输出函数,可以根据指定格式从标准输出设备中输出信息.
原型:int printf()( const char* format , [argument] ... );(调用时需要添加<stdio.h>头文件
参数:format:格式控制符,argument:可选参数.
返回值:若成功则返回输出的字符数,输出出错则返回负值.
额外说明
格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出;另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式.
参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误.
注意:printf()函数从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的.所我们看见的结果是,从右边开始处理的.


四、函数格式化字符串详解:
格式样化字符串的格式样是:%[标志][输出最小宽度][.精度][长度]式样字符

1、标志
  标志              意义
  -                   结果左对齐,右边填空格
  +                   输出标记(正号或负号)
  空格                输出值为正时输出空格,为负时输出负号
  #                   正在八进制和十六进制线显现前导航O,Ox
假如你还不太理解,没关系!请瞧下面的例子就会了如指掌了:

2.输出最小宽度:
          (1)用十进制整数来表示输出的最少位数。(至多要输出这么多位!)
           (2)若实践位数多于界说的宽度:则按实践位数输出。
           (3)若实践位数少于界说的宽度:
                                            a.则右对齐,左边留空。
                                             b.有负号,左对齐,右边留空
                                             c.表示宽度的数字以0开端,则右对齐,左边留空。
  我们再来瞧一个例子:
  例2:
  #include<stdio.h>
  int main()
  {
      int a=3456;
      printf("a=%3d/n",a);     //若实践位数多于界说的宽度:则按实践位数输出
      printf("a=%10d/n",a);    //若实践位数少于界说的宽度:则右对齐,左边留空
      printf("a=%-10d/n",a);   //若实践位数少于界说的宽度:有负号,左对齐,右边留空
      printf("a=%010d/n",a);   //若实践位数少于界说的宽度:表示宽度的数字以0开端,则右对齐,左边留空
      printf("a=%-010d/n",a); //左对齐,0无意义。
      return 0;
   }
  运转结果:
              a=3456
              a=       3456
              a=3456
              a=0000003456
              a=3456

3.精度:
精度式样符以“.”开头,后跟十进制整数。意义是:假如输出数字,则表示小数的位数;若实践位数大于所界说的精度数,则四舍五进。若不敷则补0;假如输出的是字符,则表示输出字符的个数;若实践位数大于所界说的精度数,则截走超出的部分。
例3:
#include<stdio.h>
int main()
{
printf("%.3f/n",12.3456);
printf("%.9f/n",12.3456);
printf("%.3s/n","abcdefg");
printf("%.9s/n","abcdefg");
return 0;
}
运转结果:
12.346 //四舍五进到小数点后三位
12.345600000 //不敷补0
abc
abcdefg
所以对例1中的printf("b=%lf",b)只需该为printf("b=%.2lf",b)就可以对结果进行2位小数的保存了!

4.长度:长度式样符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。

5.式样字符:
式样 意义
————————————————————————————
d: - 以十进制方式输出带标记整数(正数不输出标记);
u: - 以十进制方式输出无标记整数;
f: - 以小数方式输出单、双精度实数;
e: - 以质数方式输出单、双精度实数;
g: - 以%f,%e中较短的输出宽度输出单、双精度实数;
c: - 输出单个字符;
s: - 输出字符串。
————————————————————————————
注:l正在d,o,x,u,前,指的输出精度为long型;正在e,f,g前,指定输出精度为double型

6来谈些本义字符:
本义字符是C言语中表示字符的一种非凡方式。一般使用本义字符表示ASCII字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的单撇号( '),用于表示字符串常量的双撇号( ")和反斜杠( /)等。本义字符用反斜杠/后面跟一个字符或一个八进制或十六进制数表示。

本义字符 意义 ASCII值(十进制)
/a 响铃(BEL) 007
/b 退格(BS) 008
/f 换页(FF) 012
/n 换行(LF) 010
/r 回车(CR) 013
/t 程度制表(HT) 009
/v 笔挺制表(VT) 011
// 反斜杠 092
/? 问号字符 063
/' 单引号字符 039
/" 双引号字符 034
/0 空字符(NULL) 000
/ddd 恣意字符 三位八进制
/xhh 恣意字符 二位十六进制

字符常量中使用单引号和反斜杠以及字符常量中使用双引号和反斜杠时,都务必使用本义字符表示,即正在这些字符前加上反斜杠。

正在C步骤中使用本义字符/ddd或者/xhh可以方便灵便地表示恣意字符。/ddd为斜杠后面跟三位八进制数,该三位八进制数的值即为对应的八进制ASCII值。/x后面跟两位十六进制数,该两位十六进制数为对应字符的十六进制ASCII值。

使用本义字符时需求注重以下标题:
(1) 本义字符中只能使用小写字母,每个本义字符只能瞧作一个字符。
(2) /v 笔挺制表和/f 换页符对屏幕没有任何影响,但会影响打印机施行呼应作。
(3) 正在C步骤中,使用不可打印字符时,一般用本义字符表示。

其他需求注重的一些标题:

1.假如用浮点数表示字符或整型量的输特别式, 小数点后的数字代表最大宽度, 小数点前的数字代表最小宽度。
例如: %6.9s 表示显现一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符卖前的内容将被增除。
2.使用printf函数时还要注重一个标题,那就是输出表列中的求值顺序。差别的编译零碎不一定相反,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。请瞧下面两个例子:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容