printf用法整理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tingyun_say/article/details/51416471

首先,是基本的输出格式控制(用于和输出数据类型控制结合一起使用)
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
*/

有什么错误请指出

展开阅读全文

没有更多推荐了,返回首页