Printf函数语法
函数声明
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)
说明符(specifier)用于规定输出数据的类型,含义如下:
示例代码:
// 以下程序用于输出各种格式化数据(其中 “\n” 表示换行的转义字符,具体见下文的转义字符说明):
#include <stdio.h>
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
flags(标志)
标志(flags)用于规定输出样式,含义如下:
示例代码:
#include <stdio.h>
#define PAGES 931
int main() {const double RENT = 3852.99; // const-style constantprintf("*%-10d*\n", PAGES); //左对齐,右边补空格printf("*%+4.2f*\n", RENT); //输出正负号printf("%x %X %#x\n", 31, 31, 31); //输出0xprintf("**%d**% d**% d**\n", 42, 42, -42); //正号用空格替代,负号输出printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6); //前面补0return 0;
}//程序运行结果:
*931 *
*+3852.99*
1f 1F 0x1f
**42** 42**-42**
** 6** 006**00006** 006**
width(最小宽度)
最小宽度(width)用于控制显示字段的宽度,取值和含义如下:
示例代码: [3]
#include <stdio.h>
#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(精度)
精度(.precision)用于指定输出精度,取值和含义如下:
示例代码:
#include <stdio.h>
int main() {const double RENT = 3852.99; // const-style constantprintf("*%4.2f*\n", RENT);printf("*%3.1f*\n", RENT);printf("*%10.3f*\n", RENT);return 0;
}//程序运行结果:
*3852.99*
*3853.0*
* 3852.990*
length(类型长度)
类型长度(length)用于控制待输出数据的数据类型长度,取值和含义如下:
示例代码:
#include <stdio.h>
#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 <stdio.h>
int main(void) {printf("This\nis\na\ntest\n\nShe said, \"How are you?\"\n");return 0;
}//程序运行结果:
This
is
a
testShe said, "How are you?"
注意事项编辑
函数返回值
printf 函数的返回值为其输出字符串常量的字符数(注意字符数与字数的区别),注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符)。
打印较长字符串
有时printf 语句会很长,以至于不能在一行被放下,如果我们必须分割一个字符串,有以下三种方式可以选择。需要注意的是,我们可以在字符串中使用 “\n” 换行符来表示换行字符,但是在字符串中不能通过回车键来产生实际的换行字符。
示例代码:
#include <stdio.h>
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格式化输出函数》