使用manpages(man 3 printf)查看到的printf函数如下定义:
#include
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,...);
上面这几个函数都很好用,而且也很好理解。对于格式化输出字符串非常有用,比如Linux下面的rpc编程,函数调用只能有一个参数,那么要传递多个参数呢?当然是使用字符串了,将你定义的字符串按约定格式输出到一个buffer字符串中,然后传递就可以了。
下面主要讲讲格式化输出中的格式!
----------------------------------------------------------------------------------
基本格式 含义
%d 整型十进制
%u 无符号整型(对于八进制,十六进制来说没有符号区别)
%o 八进制
%x/%X 小写/大写的十六进制
%c 字符
%s 字符串
%f 浮点数,不使用科学表示法
%g/%G 六位有效数字表示法,当太大或太小时自动使用科学表示法
%e/%E 科学表示法,六位有效数字
----------------------------------------------------------------------------------
修饰符 含义
l 修饰整型数据,表示long,如%ld,%lu,%lo,%lx
宽度修饰符 最小输出宽第,从来不会截断输出如:%10d
精度修饰符 对于整型,如果不够大,那么会在前面补0,对于字符
串,会补空格,对于浮点数%f,%e表示小数点后多少
位。
---------------------------------------------------------------------------------
标志 含义
‘-’ 左对齐
‘+’ 输出正负号,当然是对于十进制数来说的
‘ ’ 和‘+’类似,但是正数
---------------------------------------------------------------------------------
可变域宽和精度
当想要打印出指定宽度的数字或字符串时,就可以指定域宽,如:
#define NAMESIZE 14
char name[NAMESIZE];
printf("%NAMESIZEs/n",name);
但是:上面的语法有错误,编译的时候会提示错误的类型%N,因为宏由预编译来处理,而预编译不会进入到字符串内部!
当想要打印指定的字符串宽度怎么办呢?使用宽度和精度修饰符“*”。
printf("%*.*s/n",14,14,name);
printf("%*.*s/n",14,5,name); //只打印出5个字符,前面补空格
----------------------------------------------------------------------------------
ANSI C新增的修饰符%n
%n将打印了的字符数输出到一个变量中,如
printf("hello%%n%n",&n);
printf("n=%d/n",n); //将打印出7