一、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是按从右到左进行的。请瞧下面两个例子: