首先,是基本的输出格式控制(用于和输出数据类型控制结合一起使用)
1.% 格式说明的起始符号
2.- 表示左对其,一般直接加在%号后
3.0 有0表示指定空位填充0,省略表示空位不填
4.m.n m表示域宽,也就是在输出设备上占的空间,字符数。n指的是精度,当输出float或double时,可以指定输出小数点后n位,默认n==6.一般直接输出浮点型数都是小数点后6位。
5.l l对整形而言表示long,对实型(又称实数或者浮点数)表示double
6.h 用于将整型的格式字符修正为short型
这里使用最简单的%d和%f大致说明格式控制符的作用
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int a = 100;
//带 - 号左对齐
printf("%-10d\n",a);
//默认右对齐
printf("%10d\n",a);
//带0,指定空位都填充0
printf("%010d\n",a);
double b = 22.22;
//占10个字符域宽,且指定小数点后只显示一位,m.n格式只针对浮点型数有效
printf("%-10.1f\n",b);
long c = 1000;
//l+d表示long型,l+f表示double型
printf("%ld\t%lf\n",c,b);
//h表示short型(一般有short int或short unsigned int)
//当遇到%hd或%hu输出,注意它们的取值范围
int d = 32767;
printf("%hd\n",d); //%hd只支持输出-32768~32767(65536个数字)间的数,超过了会自动转成这个范围内的数。如32768 == -32768,32769 == -32767....
int e = 65535;
printf("%hu\n",e); //%hu只支持输出无符号的0~65535间的数,超过了也会自动转成这个范围内的数。如65536 == 0,65537 == 1 ....负数也是类似的推导
return 0;
}
粘的输出格式对不齐,还是弄张图片:
接下来看具体的输出数据类型控制:(上面我们只使用到了%d和%f)
1.d 像我们上面使用到的,输出十进制整数,可以和格式控制符搭配成以下几种输出形式
%d 正常输出一个整形,按实际长度输出
%md m指定输出字段的宽度。如果m>字符本身宽度,则字符右对齐,左边填补上空格
%ld 输出长整型数据
2.o 以无符号八进制形式输出整数。对长整型可以使用%lo格式输出。also,也可以指定字段宽度输出,和d用法一样%mo。
3.x 以无符号十六进制形式输出整数。对长整型使用%lx格式输出。同上,%mx指定字段宽度。
4.u 以无符号十进制形式输出整数,即unsigned int。长整型使用%lu,短整型%hu。%mu指定字段宽度。
5.c 输出一个单字符,char
6.s 输出一个字符串,有以下几种用法
%s 正常输出一个字符串
%ms 和其他类型一样,指定字段宽度m。m>字符串宽度,字符串右对齐,左侧填充空格
%-ms 格式控制符号 - ,指定有效字符左对齐,在m位的宽度中,右侧填充空格,与上相反
%m.ns m字段宽度,但是只取有效字符串中左端n个字符,这n个字符右对齐,左侧填充空格
%-m.ns 效果同上,将得到的n个有效字符左对齐,右侧填充空格
最后面的两种情况中,当n>m时候,表示所有有效字符都选中,正常输出,之后就是左右对齐的事情了。
7.f 输出实数(也就是浮点型数)
%f 正常输出一个浮点型数,小数点后6位
%m.nf 指定宽度m,其中小数位数为n(不指定就为6)。如果你指定的m小于字段宽度,会按照f的规则输出到小数点后6位,整数部分正常输出,当m>(整数部分+1+6)[1表示小数点,n == 6],这时候才会向右对齐。否则正常输出全部有效字段,小数点不足6位数补0
double f = 111.11111;
printf("%011f\n",f); //这时 m = 11 > 10 = (3+1+6),右对齐,空白位补了个0
printf("%011.3f\n",f);//限制小数点后3位,右对齐,其余位补0
/*输出
0111.111110
0000111.111
*/
double f = 111.11111;
printf("%05f\n",f); //这时 m = 5< 10 = (3+1+6),输出全部有效字段
/*输出
111.111110
*/
%-m.nf 同上,如果m>(整数部分+1+6),左侧对齐,右侧补空格
8.e 以指数形式输出6位小数,指数部分占5或4位
%e 按照上面规则正常输出
%m.ne
%-m.ne 与浮点数类似,m表示整个输出的宽度,n表示所占的小数位数,这里整数部分肯定是1位。
double d = 111111111.111;
printf("%010.1e\n",d); //占10位宽度,1位小数点,指数部分有4位,说明前面空了3位,(%后加0表示空白位用0填充)
/*输出
0001.1e+08
*/
9.g 自动选择f格式或e格式中较短的一种输出。并且不输出无意义的0
上面两种方式的结合使用就能正常应对绝大部分字符输出情况了,剩下的是几种特殊的字符和printf的特殊用法
1.字符串%的输出
使用连续两个%号来输出
printf("%f%%",1.0/3);
/*输出
0.333333%
*/
这里提到一点:
对于单精度数,用%f格式符输出时,仅仅前7位是有效数字,小数6位
对于双精度数,使用%lf格式符输出时,前16位是有效数字,小数6位
这和浮点数在计算机中存储的方式有关,这里不作过多解释,下一章整理一下。
2.对于m.n的格式,还可以使用如下的方法来表示
//char ch[20];
//printf("%*.*s\n",m,n,ch);
//可以通过传入参数来对格式进行控制
char ch[20] = "abcdefigh";
int m = 10;
int n = 5;
printf("%*.*s\n",m,n,ch);
/*输出
abcde
*/
3.输出格式%n可以将所输出的字符串的长度赋给一个变量
int strlen;
printf("hello world%n",&strlen);
printf("strlen = %d\n",strlen);
/*输出
hello world
strlen = 11
*/
有什么错误请指出