#include<stdio.h>
int printf(const char *format,...);
int fprintf(FILE *stream,const char *format,...);
int sprintf(char *str,const char *format,...);
int snprintf(char *str,size_t size,const char *format,...);
printf函数族功能:将用户指定的内容按照指定的方式,输出到指定的位置
内容:函数最后一个参数...就是内容
方式:format就是输出的方式(重点)
位置:printf输出到标准输出(屏幕),fprintf输出到文件,sprintf输出到字符串
一、格式format参数说明
char str[20]="hongwazi",age=12;
printf("hello my name is :%s,my age is:%d",str,age)
前面引号括起来的内容就是format的格式了
format格式:直接输出和格式转换
格式转换是以%开头,后面接的字符和数字都是有规定的,有几个%,后面就必须跟几个输出的变量与之对应
二、格式用法举例
2.1 整数的输出
%x 使用十六进制数字0f的无符号十六进制整数
%X 使用十六进制数字0f的无符号十六进制整数
%d 有符号十进制整数
%u 无符号十进制整数
%o 无符号八进制整数
%p 指针
int a=1000;
char buf[100];
printf("%d\n%x\n%X\n%o\n",a,a,a,a);//将a按十进制,十六进制,八进制分别打印到屏幕
printf("%p\n",&a);//打印出地址
sprintf(buf,"%d%x%X%o",a,a,a,a);//将a按十进制,十六进制,八进制分别打印到字符串buf中
printf("%s",buf);
2.2 字符(串)输出
%c 字符
%s 字符串
char buf[100]="hello world",a='!';
printf("hehe:%s,%c",buf,a);//打印出字符串到屏幕
2.3 位宽控制
%- 左对齐输出,省略右对齐
%m 显示总共占m个字节个字节,如果内容大于m个字节则该设置无效
%0 空位填0,省略空位不填
%m.n 显示总共占m个字节,显示内容的前n个字节
%.n 显示内容的前n个字节
%-m.n 显示总共占m个字节,显示内容的前n个字节,左对齐
char *s="Hello world!";
printf(":%s:\n",s);//直接打印出s,在屏幕上占12个字节
printf(":%10s:\n",s);//在屏幕上占10个字节,但是内容本身大于10,该设置无效,在屏幕上占12个字节
printf(":%.10s:\n",s);//在屏幕上只输出内容的前10个字节,内容大于10个字节,所以s被截断
printf(":%-10s:\n",s);//左对齐,在屏幕上占10个字节,但是内容本身大于10,该设置无效,在屏幕上占12个字节
printf(":%15s:\n",s);//在屏幕上占15个字节,内容小于15,右对齐
printf(":%.15s:\n",s);//显示内容的前15个字节,内容小于15,在屏幕上占12个字节
printf(":%-15s:\n",s);//在屏幕上占15个字节且左对齐
printf(":%15.10s:\n",s);//在屏幕上占15个字节且右对齐,只显示内容的前10个字节
printf(":%-15.10s:\n",s);//在屏幕上占15个字节且左对齐,只显示内容的前10个字节
2.4 浮点数输出
%e 浮点数、e-记数法
%E 浮点数、E-记数法
%f 浮点数、十进制记数法
%a 浮点数、十六进制数字和p-记数法
%A 浮点数、十六进制数字和p-记法
double ddd=563.9085566;
printf(":%f:\n",ddd);//默认输出小数点后6位
printf(":%8f:\n",ddd);//占屏幕8个字节,小于实际11,设置无效
printf(":%.3f:\n",ddd);//保留小数点后3位
printf(":%3.3f:\n",ddd);//保留小数点后3位
printf(":%13.3f:\n",ddd);//占屏幕13个字节且保留小数点后3位,右对齐
printf(":%-13.3f:\n",ddd);//占屏幕13个字节且保留小数点后3位,左对齐
注意:%m.n 对于字符串m是占屏幕的字节数,n是显示内容的前n个字节;对于浮点数 m也是占屏幕的字节数,n是小数点后的位数,默认为6
2.5 动态传位宽
printf("%.*s \n", 8, "abcdefgggggg");//等同于printf("%.8s\n","abcdefgggggg");
printf("%*.*f\n", 3,3, 1.25456f);//等同于printf("%3.3f\n",1.25456);
三、sprintf的用法
sprintf的format和上面一致,这里就直接说明它的用法
3.1 将数字转换成字符串
char s[50];
sprintf(s, "%d", 1234567);//将123456转换为字符串保存在s中并在末尾添上'\0'
printf("%s",s);
sprintf(s, "%x", 1234567);//将123456按16进制转换为字符串保存在s中并在末尾添上'\0'
printf("%s",s);
sprintf(s, "%f", 3.1415926);//产生"3.141593"
printf("%s\n",s);
return 0;
3.2 连接字符串
char s[20];
char* who = "I";
char* whom = "优快云";
sprintf(s, "%s love %s.", who, whom); //产生:"I love 优快云. "
printf("%s",s);
char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
//sprintf(s, "%s%s", a1, a2); //Don't do that! 十有八九要出问题了。是否可以改成:
sprintf(s, "%.7s%.7s", a1, a2);//产生:"ABCDEFGHIJKLMN"
printf("%s\n",s);
3.3 sprintf返回值
spritnf返回了本次函数调用最终打印到字符缓冲区中的字符数目。也就是说每当一次sprinf调用结束以后,你无须再调用一次strlen便已经知道了结果字符串的长度。
srand(time(0));
char s[64];
int offset = 0;
for(int i = 0; i < 10; i++) {
offset += sprintf(s + offset, "%d,", rand() % 100);
}
s[offset - 1] = '\n';//将最后一个逗号换成换行符。
printf(s);
return 0;
设想当你从数据库中取出一条记录,然后希望把他们的各个字段按照某种规则连接成一个字符串时,就可以使用这种方法,从理论上讲,他应该比不断的strcat效率高,因为strcat每次调用都需要先找到最后的那个’\0’的位置,而在上面给出的例子中,我们每次都利用sprintf返回值把这个位置直接记下来了。
参考文章:
http://bbs.ednchina.com/BLOG_ARTICLE_154227.HTM
http://blog.youkuaiyun.com/defeattroy/article/details/5540067