目录
1.printf 函数简介
printf 是指格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。printf 是C语言标准库函数,定义于头文件 <stdio.h>。
函数原型为:
int printf ( const char * format, ... );
format -- 是格式控制字符串,包含了两种类型的对象:普通字符和转换说明。在输出时,普通字符将原样不动地复制到标准输出,转换说明并不直接输出而是用于控制 printf 中参数的转换和打印。每个转换说明都由一个百分号字符(%)开始,以转换说明结束,从而说明输出数据的类型、宽度、精度等。
返回值: 正确返回输出的字符总数,错误返回负值,与此同时,输入输出流错误标志将被置值,可由指示器ferror来检查输入输出流的错误标志。
2.格式控制
格式说明符遵循以下原型:
%[flags][width][.precision][length]specifier
flags --- 标志
wideth --- 最小宽度
.precision --- .精度
length --- 类型长度
specifier --- 指示符/说明符/分类符
说明符是最重要的组成成分,因为它定义了相应参数的类型和解释。
<1>: 说明符
说明符 | 输出 | 示例 |
d or i | 有符号十进制整数 | printf("%d",1234); 输出 1234 |
u | 无符号十进制整数 | printf("%u",1234); 输出 1234 |
o | 无符号八进制整数 | printf("%o",1234); 输出 2322 |
x | 无符号十六进制整数 | printf("%x",1234); 输出 4d2 |
X | 无符号十六进制整数(大写) | printf("%X",1234); 输出 4D2 |
f | 十进制浮点数(小写) | printf("%f",1234.5); 输出 1234.500000 (默认保存小数点后6位) |
F | 十进制浮点数(大写) | printf("%f",1234.5); 输出 1234.500000 (默认保存小数点后6位) |
e | 科学计数法(尾数/指数)小写 | printf("%e",0.0000001234); 输出 1.234000e-07 |
E | 科学计数法(尾数/指数)大写 | printf("%E",0.0000001234); 输出 1.234000E-07 |
g | 使用最短表示法:%e 或 % f | printf("%g",0.0000001234); 输出 1.234e-07 |
G | 使用最短表示法:%E 或 % F | printf("%G",0.0000001234); 输出 1.234E-07 |
a | 十六进制浮点数(小写) | printf("%a",1234.5); 输出 0x1.34a0000000000p+10 |
A | 十六进制浮点数(大写) | printf("%A",1234.5); 输出 0X1.34A0000000000P+10 |
c | 字符 | printf("%c\n",65); 输出 A |
s | 字符串 | printf("%s","abcdefg"); 输出 abcdefg |
p | 字符指针地址 | printf("%p","a"); 输出 00907BD8 |
n | 什么也不打印,对应的实参必须是指向有符号int型的指针。到目前为止写入的字符数存储在指向的位置中 | |
% | 一个%后面跟着另一个%字符将写入一个% | printf("%%"); 输出 % |
<2>:标志
字符 | 名称 | 说明 |
- | 减号 | 在给定的字段宽度内左对齐(默认为右对齐) |
+ | 加号 | 结果为正数,需要在结果前加上正号(默认情况下,只有负数前面有-号) |
(space) | 空格 | 如果不写入任何符号,则在值之前插入一个空格 (输出为+加空格) |
# | #号 | flags是o、x、X时,增加前缀0、0x、0X。flags是a、A、e、E、f、g、G时,一定使用小数点。默认的,如果使用.0控制不输出小数部分,则不输出小数点。flags是g、G时,尾部的0保留。 |
0 | 数字零 | 当指定填充时,用0而不是空格左填充数字 |
示例代码:
#include<stdio.h>
int main()
{
printf("%6d\n", 100); //默认右对齐,左边补空格
printf("%-6d\n", 100); //左对齐,右边补空格
printf("\n");
printf("%+d %-d\n", 100, -100);//输出正负号
printf("%d %d\n", 100, -100);
printf("% d % d\n", 100, -100);//正号使用空格代替,负号正常输出
printf("\n");
printf("%o %#o %#x %#X\n", 100,100,100, 100);// # - 前缀为0、0x、0X
printf("%.0f %#.0f\n", 100.0,100.0);//小数点后的值不输出但仍然使用小数点
printf("%g %#g\n", 100.0, 100.0);//尾部的0保留
printf("\n");
printf("%06d\n", 100);//前面补0
printf("\n");
return 0;
}
运行结果为:
<3>:最小宽度
如果实际位数小于最小宽度应填补空格或者0;若实际位数大于最小宽度,则按实际位数输出。
最小宽度 | 描述 | 示例 |
数值 | 十进制整数 | printf("%06d\n", 100); 输出 000100 |
* | 星号。不显示指明输出最小宽度,而是以星号代替,在printf的输出参数列表中给出 | printf("%0*d\n", 6,100); 输出 000100 |
<4>:精度
精度 | 描述 |
.数值 | 对于整数说明符(d, i, o, u, x, x): precision指定要写入的最小位数。如果要写入的值比这个数字短,结果将用前导零填充。即使结果较长,该值也不会被截断。精度为0表示不为值0写入任何字符。 数量对于a, A, e, E, f和F说明符:这是小数点后要打印的位数(默认情况下,为6位)。 对于g和G说明符:这是要打印的有效位数的最大数目。 对于s :这是要打印的最大字符数。默认情况下,将打印所有字符,直到遇到结尾的null字符。如果指定的句点没有明确的精度值,则假定为0。 |
.* | 精度没有在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数指定。 |
示例代码:
#include<stdio.h>
int main()
{
printf("%.6d\n", 1234);//不够指定宽度,前面缺失的用0补充
printf("\n");
printf("%.6f\n", 1234.12345678);//超过指定精度,会被截断
printf("\n");
printf("%.6g\n", 1234.12345678);//最大有效位数目 -- 自己指定的
printf("\n");
printf("%.10s\n", "abcdefgh");//默认情况下,打印所有的字符
printf("%.6s\n", "abcdefgh");//超过指定位数 --- 截断
printf("\n");
return 0;
}
运行结果为:
<5>:类型长度
类型长度指明待输出数据的长度,相同类型可以有不同的长度。
eg: 整型包括短整型(16bit),整型(32bit),长整型(64bit)
注意关于c说明符:它接受int(或wint_t)作为参数,但在格式化输出之前执行适当的转换为char值(或wchar_t)。
注意:黄色行表示C99引入的说明符和子说明符。有关扩展类型的说明符,请参见<cinttypes>。
示例代码:
#include<stdio.h>
int main()
{
printf("%d\n", 'A');//有符号整数
printf("\n");
printf("%hhd\n", 'A');//有符号 char
printf("%hhu\n", 'A'+128);//无符号 char
printf("\n");
printf("%hd\n", 12345);//有符号短整型
printf("%hu\n", 67891);//无符号短整型
printf("\n");
return 0;
}
运行结果为:
3.printf彩色输出
彩色输出格式:
printf("\033[显示方式;字背景颜色;字体颜色m…\033[0m")
控制命令以 \033[ 开头,以m结尾,而中间则是属性码,属性代码之间使用 ; 分隔,如\033[1;34;42m ,最后以默认颜色 \033[0m 结尾,以避免影响后面正常打印!
显示方式:
样式 | 显示方式 |
默认 | 0 |
高亮显示 | 1 |
下划线 | 4 |
闪烁 | 5 |
反白显示 | 7 |
不可见 | 8 |
前景颜色和背景颜色:
颜色 | 前景颜色 | 背景颜色 |
黑色 | 30 | 40 |
白色 | 37 | 47 |
红色 | 31 | 41 |
绿色 | 32 | 42 |
黄色 | 33 | 43 |
蓝色 | 34 | 44 |
紫红色 | 35 | 45 |
青蓝色 | 36 | 46 |
示例代码:
#include<stdio.h>
int main()
{
printf("\033[0m\033[1;31m%s\033[0m", "hello world");
return 0;
}
运行结果为:
更多示例:
#include<stdio.h>
int main()
{
printf("\033[0m\033[1;31m%s\033[0m\n", "hello world");//红色字体
printf("\033[0m\033[1;32m%s\033[0m\n", "hello world");//绿色字体
printf("\033[0m\033[1;33m%s\033[0m\n", "hello world");//黄色字体
printf("\033[0m\033[1;34m%s\033[0m\n", "hello world");//蓝色字体
printf("\033[0m\033[1;35m%s\033[0m\n", "hello world");//紫红色字体
printf("\033[0m\033[1;47;35m%s\033[0m\n", "hello world");//白色背景颜色,紫红色字体
printf("\033[0m\033[1;43;37m%s\033[0m\n", "hello world");//黄色背景颜色,白色字体颜色
return 0;
}
运行结果为: