printf 函数的声明如下:
// C99 前
int printf( const char *format, ... );
// C99 起
int printf( const char *restrict format, ... );
format – 是格式控制字符串,包含了两种类型的对象:普通字符和转换说明 。在输出时,普通字符将原样不动地复制到标准输出,转换说明并不直接输出而是用于控制 printf 中参数的转换和打印。每个转换说明都由一个百分号字符(%)开始,以转换说明结束,从而说明输出数据的类型、宽度、精度等 。
printf 的格式控制字符串 format 中的转换说明组成如下,其中 [] 中的部分是可选的:
%[flags][width][.precision][length]specifier,即:%[标志][最小宽度][.精度][类型长度]说明符 。转换说明详解见下文。
附加参数 – 根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
printf 函数在输出格式 format 的控制下,将其参数进行格式化,并在标准输出设备(显示器、控制台等)上打印出来。
如果函数执行成功,则返回所打印的字符总数,如果函数执行失败,则返回一个负数。
format 转换说明组成是%[flags][width][.precision][length]specifier ,具体讲解如下:
说明符(specifier)用于规定输出数据的类型,含义如下:
示例代码:
// 以下程序用于输出各种格式化数据(其中 “\n” 表示换行的转义字符,具体见下文的转义字符说明):
#include
int main() {
char ch = 'h';
int count = -9234;
double fp = 251.7366;
// 显示整数
printf( "Integer formats:\n"
" Decimal: %d Unsigned: %u\n", count, count);
printf( "Decimal %d as:\n Hex: %Xh "
"C hex: 0x%x Octal: %o\n", count, count, count, count );
// 显示字符
printf("Characters in field:\n"
"%10c\n", ch);
// 显示实数
printf("Real numbers:\n %f %.2f %e %E\n", fp, fp, fp, fp );
return 0;
}
//程序运行结果:
Integer formats:
Decimal: -9234 Unsigned: 4294958062
Decimal -9234 as:
Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756
Characters in field:
h
Real numbers:
251.736600 251.74 2.517366e+002 2.517366E+002
示例代码:
#include
#define PAGES 931
int main() {
const double RENT = 3852.99; // const-style constant
printf("*%-10d*\n", PAGES); //左对齐,右边补空格
printf("*%+4.2f*\n", RENT); //输出正负号
printf("%x %X %#x\n", 31, 31, 31); //输出0x
printf("**%d**% d**% d**\n", 42, 42, -42); //正号用空格替代,负号输出
printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6); //前面补0
return 0;
}
//程序运行结果:
*931 *
*+3852.99*
1f 1F 0x1f
**42** 42**-42**
** 6** 006**00006** 006**
最小宽度(width)用于控制显示字段的宽度,取值和含义如下:
示例代码: [3]
#include
#define PAGES 931
int main() {
printf("*%2d*\n", PAGES); //输出的字段长度大于最小宽度,不会截断输出
printf("*%10d*\n", PAGES); //默认右对齐,左边补空格
printf("*%*d*\n", 2, PAGES); //等价于 printf("*%2d*\n",PAGES)
return 0;
}
//程序运行结果:
*931*
* 931*
*931*
精度(.precision)用于指定输出精度,取值和含义如下:
示例代码:
#include
int main() {
const double RENT = 3852.99; // const-style constant
printf("*%4.2f*\n", RENT);
printf("*%3.1f*\n", RENT);
printf("*%10.3f*\n", RENT);
return 0;
}
//程序运行结果:
*3852.99*
*3853.0*
* 3852.990*
类型长度(length)用于控制待输出数据的数据类型长度,取值和含义如下:
示例代码:
#include
#define PAGES 336
int main() {
short num = PAGES;
long n3 = 2000000000; long n4 = 1234567890;
printf("num as short and unsigned short: %hd %hu\n", num, num); printf("%ld %ld\n", n3, n4);
return 0;
}
//程序运行结果:
num as short and unsigned short: 336 336 2000000000 1234567890
转义序列在字符串中会被自动转换为相应的特殊字符。printf() 使用的常见转义字符如下:
示例代码: [2]
#include
int main(void) {
printf("This\nis\na\ntest\n\nShe said, \"How are you?\"\n");
return 0;
}
//程序运行结果:
This
is
a
test
She said, "How are you?"
printf 函数的返回值为其输出字符串常量的字符数(注意字符数与字数的区别),注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符)。
有时printf 语句会很长,以至于不能在一行被放下,如果我们必须分割一个字符串,有以下三种方式可以选择。需要注意的是,我们可以在字符串中使用 “\n” 换行符来表示换行字符,但是在字符串中不能通过回车键来产生实际的换行字符。
示例代码:
#include
int main() {
//方式一:使用多个printf语句
printf("Here's one way to print a ");
printf("long string.\n");
//方式二:使用反斜杠 "\" 加回车的组合来进行分割,注意下一行要从最左侧开始,否则缩进会成为该字符串的一部分
printf("Here's another way to print a \
long string.\n");
//方式三:采用字符串连接的方法,中间不能有逗号,可以是空格或者回车
printf("Here's the newest way to print a "
"long string.\n"); /* ANSI C */
return 0;
}
//程序运行结果:
Here's one way to print a long string.
Here's another way to print a long string.
Here's the newest way to print a long string.
参考原文:《百度百科-printf格式化输出函数》