文章目录
- 1 函数原型
- 2 参数
- 2.1 格式字符串
- 2.1.1 字面文本量
- 2.1.2 转义序列
- 2.1.3 转换说明
- 2.1.3.1 类型
- 2.1.3.2 类型长度
- 2.1.3.3 精度
- 2.1.3.4 最小宽度
- 2.1.3.5 标志
- 2.2 参数列表
- 2.3 转换说明和参数列表的关系
- 3 返回值
1 函数原型
printf():将格式化输出发送至标准输出流stdout,函数原型如下:
int printf ( const char * format, ... );
2 参数
printf()函数的参数分为两类:
- format :格式字符串;
- … :参数列表。
2.1 格式字符串
在printf()函数中:
- 格式字符串是必不可少的;
- 格式字符串由字面文本量、转义序列和转换说明三部分组成。
2.1.1 字面文本量
在格式字符串中,除了转义序列和转换说明,剩余的部分都属于字面文本量,字面文本量按照原样显示在屏幕上,代码如下所示:
int main()
{
int a = 11;
printf("The value of a = %d\n", a);
printf("\n");
return 0;
}
上面代码中,printf()函数的格式字符串包括:
- 转义序列:‘\n’,换行符;
- 转换说明:“%d”,按十进制整数显示变量a的值;
- 字面文本量:"The value of a = ",即去除转义序列和转换说明后剩余的部分都属于字面文本量,需要保持原样输出。
2.1.2 转义序列
关于转义序列:
- 所谓转义,即转变字符的含义;
- 转义序列以反斜杠字符’'开头;
- 反斜杠’字符’告诉编译器以特殊的方式解释下一个字符。
转义序列有两个用途:
- 通过移动屏幕光标来控制输出的位置;
- 用于表示具有特殊含义的字符。
常用的转义序列如下图所示:
2.1.3 转换说明
转换说明以百分号字符’%'开头,格式如下:
%[flags][width][.prec][length]type <=> %[标志][最小宽度][.精度][类型长度]类型。
2.1.3.1 类型
类型是转换说明中比不可少的部分,用于指定printf()函数按照何种格式输出表达式的值,常用的类型如下图所示:
示例代码如下所示:
int main ()
{
printf("以%%d形式打印有符号整数\n");
printf("%d\n", -123);
printf("\n");
printf("以%%u形式打印无符号整数\n");
printf("%u\n", 123);
printf("\n");
printf("以%%x/X形式打印无符号整数\n");
printf("%x\t\t%X\n", 123, 123);
printf("\n");
printf("以%%f形式打印浮点数\n");
printf("%f\n", 0.123456789);
printf("\n");
printf("以%%e/E形式打印浮点数\n");
printf("%e\t%E\n", 0.123456789, 0.123456789);
printf("\n");
printf("以%%c形式打印字符\n");
printf("%c\n", 65);
printf("\n");
printf("以%%s形式打印字符串\n");
printf("%s\n", "Hello World!");
printf("\n");
printf("以%%p形式打印指针\n");
printf("%p\n", "Hello World!");
printf("\n");
return 0;
}
代码运行结果如下图所示:
特别说明:
- C编译器用双精度来表示浮点型常量;
- C编译器在打印浮点数时,默认会打印6位小数;
- C编译器在截断小数位时会进行四舍五入操作。
2.1.3.2 类型长度
在打印整形数据时,只有%d对应int型和%u对应unsigned int型,而没有与char、unsigned char、short、unsigned short、long、unsigned long、long long和unsigned long long等数据类型对应的转换说明类型。于是,类型长度应运而生,常用的类型长度如下图所示:
特别说明:与scanf()函数不同,在printf()函数中,无论float类型还是double类型,都使用%f格式进行输出,不存在%f对应float类型变量,%lf对应double类型变量的说法。
示例代码如下所示:
int main()
{
printf("以%%hhd形式输出signed char\n");
printf("signed char = %hhd\n", 0xff);
printf("\n");
printf("以%%hhu形式输出unsigned char\n");
printf("unsigned char = %hhu\n", 0xff);
printf("\n");
printf("以%%hd形式输出signed short\n");
printf("signed short = %hd\n", 0xffff);
printf("\n");
printf("以%%hu形式输出unsigned short\n");
printf("unsigned short = %hu\n", 0xffff);
printf("\n");
printf("以%%ld形式输出signed long\n");
printf("signed long = %ld\n", 0xffffffff);
printf("\n");
printf("以%%lu形式输出unsigned long\n");
printf("unsigned long = %lu\n", 0xffffffff);
printf("\n");
printf("以%%lld形式输出signed long long\n");
printf("signed long long = %lld\n", 0xffffffffffffffff);
printf("\n");
printf("以%%llu形式输出unsigned long long\n");
printf("unsigned long long = %llu\n", 0xffffffffffffffff);
printf("\n");
return 0;
}
代码运行结果如下图所示:
2.1.3.3 精度
精度以小数点开头,后跟十进制整数,常用于指定浮点数的精度(小数点后数值位数),默认精度是6。
- 当浮点数的小数位数小于精度值时,在小数位填充至指定精度值;
- 当浮点数的小数位数大于精度值时,将小数位截断至指定精度值(四舍五入)。
示例代码如下所示:
int main()
{
printf("默认精度\n");
printf("Default precision = %f\n", 1000.123456789);
printf("Default precision = %f\n", 1000.12345);
printf("\n");
printf("超过精度-截断\n");
printf("More than specified precision = %.8f\n", 1000.123456789);
printf("\n");
printf("不足精度-填充\n");
printf("Less than specified precision = %.8f\n", 1000.123456);
printf("\n");
return 0;
}
代码运行结果如下图所示:
2.1.3.4 最小宽度
最小宽度用十进制整数来表示输出的最少位数,包括整数位、小数点和小数位。
- 若实际位数多于指定的宽度,则按实际位数输出;
- 若实际位数少于指定的宽度,则左侧填充空格输出(右对齐)。
示例代码如下所示:
int main()
{
printf("输出整数-小于最小宽度\n");
printf("Integer less than specified width = %6d\n", 123);
printf("\n");
printf("输出整数-大于最小宽度\n");
printf("Integer more than specified width = %6d\n", 12300000);
printf("\n");
printf("输出浮点数-默认精度-小于最小宽度\n");
printf("Float-point default precision less than specified width = %10f\n", 1.23);
printf("\n");
printf("输出浮点数-默认精度-大于最小宽度\n");
printf("Float-point default precision more than specified width = %6f\n", 1.23);
printf("\n");
printf("输出浮点数-指定精度-小于最小宽度\n");
printf("Float-point specified precision less than specified width = %10.3f\n", 1.23);
printf("\n");
printf("输出浮点数-指定精度-大于最小宽度\n");
printf("Float-point specified precision more than specified width = %10.10f\n", 1.23);
printf("\n");
return 0;
}
代码运行结果如下图所示:
特别说明: 精度优先级高于最小宽度优先级,先将浮点数的小数位填充或截断至默认精度或指定精度,然后再考虑最小宽度。
2.1.3.5 标志
常用的标志如下图所示:
示例代码如下所示:
int main()
{
printf("以16进制前缀形式显示整数\n");
printf("%#x\n", 123);
printf("%#X\n", 123);
printf("\n");
printf("指定最小宽度-默认右对齐-默认左侧填充空格\n");
printf("%10d\n", 123);
printf("%10f\n", 1.23);
printf("\n");
printf("指定最小宽度-默认右对齐-指定左侧填充数字0\n");
printf("%010d\n", 123);
printf("%010f\n", 1.23);
printf("\n");
printf("指定最小宽度-指定左对齐-右侧填充空格\n");
printf("%-10d\n", 123);
printf("%-10f\n", 1.23);
printf("\n");
return 0;
}
代码运行结果如下图所示:
2.2 参数列表
在printf()函数中:
- 参数列表是可选的;
- 参数列表中参数的数量是可变的;
- 参数列表中参数的类型是任意有效的C表达式。
2.3 转换说明和参数列表的关系
- 转换说明和表达式在数量、顺序和类型上都要一一对应;
- 如果表达式比转换说明多,则未匹配的表达式无法打印出来;
- 如果转换说明比表达式多,则未匹配的转换说明打印出"垃圾值"。
示例代码如下所示:
int main()
{
int a = 11;
int b = 22;
int c = 33;
printf("表达式比转换说明多\n");
printf("%d %d\n", a, b, c);
printf("\n");
printf("转换说明比表达式多\n");
printf("%d %d %d %d\n", a, b, c);
printf("\n");
return 0;
}
代码运行结果如下图所示:
3 返回值
printf()函数的返回值类型为int型:
- 输出成功,返回输出的总字符数;
- 输出失败,返回一个负数。
C语言标准描述如下:
1. Each of these functions returns the number of characters printed, or a negative value if an error occurs.
示例代码如下所示:
int main()
{
int ret_val = 0;
printf("The return value of printf() function = %d\n", ret_val = printf("Hello World!\n"));
}
代码运行结果如下图所示: