printf sprintf 用法

来源:互联网 发布:ps软件错误16 编辑:程序博客网 时间:2024/06/11 09:30

#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 = "CSDN";sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. "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.csdn.net/defeattroy/article/details/5540067