<一>
1.前言
在gcc编程中,我们比较经常用到的字符格式化输出函数是printf的,实际上gcc继承了c语言处理字符具有强大功能的风格,它提供了一系列的格式化输出函数,主要存在两个库函数文件stdio.h/ stdarg.h中,具体函数如下:
[code:1:cd7eec0dec]
#include
printf, int printf(const char *format, ...);
fprintf, int fprintf(FILE *stream, const char *format, ...);
sprintf, int sprintf(char *str, const char *format, ...);
snprintf, int snprintf(char *str, size_t size, const char *format, ...);
#include
vprintf, vprintf(const char *format, va_list ap);
vfprintf, vfprintf(FILE *stream, const char *format, va_list ap);
vsprintf, int vsprintf(char *str, const char *format, va_list ap);
[/code:1:cd7eec0dec]
其中:
printf和vprintf函数主要是向一个标准输出设备或标准的字符流输出格式化后的字符。
Fprintf和vfprintf 函数主要是向一个给定的字符流设备输出格式化后的字符。
而sprintf, snprintf, vsprintf 和vsnprintf函数则是将格式化后的结果赋值给一个字符串。
虽然函数的功能上有差异,返回的值的类型也不尽相同,但是在建立匹配格式的语法上还是相同的,这几个函数都有一些共同特征,就是你要设计好模板和格式化的字串。这些函数格式化字符串的命令主要是通过模板字符串中跟在“%”后面的字符来控制的。
如下一个例子中:
[code:1:cd7eec0dec]
int pct = 37;
char filename[] = "foo.txt";
printf ("Processing of `%s' is %d%% finished.Please be patient.",filename, pct);
[/code:1:cd7eec0dec]
显然,这个例子的打印结果就是如下:
Processing of `foo.txt' is 37% finished.Please be patient.
如上例子我们可以看出一般格式化函数的语法特点就是包含格式化匹配的字符串,输出的字串和变量组合的结构。
2.参数详细介绍
由于大部分函数在如何格式化字串部分的语法非常相似,我们先研究他们的共同特点,然后再应用不同的例子来分析其不同特点:此类函数一般的调用格式为:printf("<格式化字符串>", <参量表>;
其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。
2.1 Gcc提供的格式化规定符如下:
%d
十进制有符号整数
%i
十进制有符号整数
注:上面这两个函数在格式化输出时用途是相同的,但在输入时却是不一样的,%i可以接受任何形式的整数,而%d却不能。
%u
十进制无符号整数
%f
输出浮点数
%s
输出字符串
%c
输出单个字符
%p
输出指针的值
%e %E
指数形式的浮点数 ,其中:%e是以小写形式输出的 %E是以大写形式输出的
%x, %X
无符号以十六进制表示的整数,其中:%x是以小写形式输出的 %X是以大写形式输出的
`%g', `%G'
根据输出数据的大小需要决定用普通形式还是指数形式的输出方式,其中: %g是以小写形式输出的 %G是以大写形式输出的
%o
无符号以八进制表示的整数
`%c
'输出单个字符
%n
得到输出字符的个数,但是本参数不产生任何的输出效果。
`%m'
输出错误时的相应的字符串提示。
`%%'
输出正文字符中的“%”字符
说明:
可以在"%"和字母之间插进数字表示最大场宽。例如: %3d 表示输出3位整型数, 不够3位右对齐。%9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,小数点占一位, 不够9位右对齐。%8s 表示输出8个字符的字符串, 不够8个字符右对齐。如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出;若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。另外, 若想在输出值前加一些0, 就应在场宽项前加个0。例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度,小数点前的数字代表最小宽度。
例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。
可以在"%"和字母之间加小写字母l, 表示输出的是长型数。
例如: %ld 表示输出long整数%lf 表示输出double浮点数
可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可
说明输出为左对齐, 否则为右对齐。例如: %-7d 表示输出7位整数左对齐%-10s表示输出10个字符左对齐
2.2 一些特殊规定字符
换行
f 清屏并换页
回车
Tab符
xhh 表示一个ASCII码用16进表示,其中hh是1到2个16进制数
HopeCao 回复于:2003-02-28 13:14:31
<二>
3.格式化转换的具体细则
3.1 整数转换部分
整数转换部分主要是'%d', '%i', '%o', '%u', '%x', 和 '%X'这几个参数命令的,由于参数的不同,可以输出不同格式的结果。如上表所列: '%d', '%i'是输出一个带符号的十进制的数,'%o', '%u', and '%x'是输出一个不带符号的数,而'%X是'%x''的大写形式。其中,针对这几种不同输出选择还有如下几个参数项:
'-’ 表示是左对齐,一般都是右对齐的。
'+’ 是对'%d', '%i'两个参数而言的,是指以'+’符号表示正数
' ' 是对'%d', '%i'两个参数而言的,如果输出不是以'+’'-’开头的,那么用空格做开头。
'#' 是对'%o'参数而言的,将在输出的结果强制加上'0’为开头。
''' 将输出的数字以LC_NUMERIC的分类法用’,’隔开。
'0' 将空格的地方用'0'填入。
如果没有特别指明,被格式化的参数被默认当作整数处理,或者可以用以下的类型指定参数来进行修改,如下:
'h' 指定传入参数是 short int 或unsigned short int类型的
'l' 指定传入参数是 long int或unsigned long int类型的
'q' 指定传入参数是 long long int类型的
'Z' 指定传入参数是size_t.。