• 格式化输出函数:printf 那些事 (C语言)



    printf函数提供格式化输出转换

    函数包含在头文件  <stdio.h>  中

    #include <stdio.h>
        ......

     函数的原型在头文件的声明为

    _CRTIMP __cdecl __MINGW_NOTHROW  int printf (const char *, ...);

    第一个参数  const char * 来指明输出的格式 , 按照格式对输出进行转换, 并写到标准输出流中(stdin),后面的三个点  . . . 表示此处的参数是可变参数,这样可以满足不同的输出需求

     如果打印输出成功函数返回打印的字节数(函数返回值为  int  类型), 如果出错则返回一个负值

    1 #include <stdio.h>
    2 
    3 int main()
    4 {
    5     int i = printf("你好
    ");
    6     printf("%d
    ", i);
    7     return 0;
    8 }

     输出

    你好
    5

     成功输出   你好  并且返回打印的字符个数  5  (一个汉字的编码占2个字节 * 2 + ' '一个字节  = 5)

    格式串由两种类型对象组成:

    ----- 普通字符(将被复制到输出流中)

    ----- 转换说明(分别决定下一个后续参数的转换和打印), 每个转换说明均以 % 开头, 以转换字符结束, 在%与转换字符之间可以一次包括下列内容

    • 标志

             -   指定被转换的参数在其字段内左对齐

    1 #include <stdio.h>
    2 
    3 int main()
    4 {
    5     printf("%20s
    ", "hello world
    ");
    6     printf("%-20s
    ", "hello world
    ");
    7     return 0;
    8 }

                  输出

            hello world
    
    hello world

                +  只定在输出的数前面加上正负号

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int i = printf("%20s
    ", "hello world
    ");
     6     printf("%d
    ", i);
     7     printf("%+d
    ", i);
     8     printf("%+d
    ", -i);
     9     return 0;
    10 }

                输出

            hello world
    
    21
    +21
    -21

                空格  如果第一个字符不是正负号, 则在它的前面加上空格

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int i = printf("%20s
    ", "hello world
    ");
     6     printf("%d
    ", i);
     7     printf("%+d
    ", i);
     8     printf("%+d
    ", -i);
     9     printf("%+ d
    ", -i);
    10     printf("% d
    ", i);
    11     return 0;
    12 }

                 输出

            hello world
    
    21
    +21
    -21
    -21
     21

                  0  对于数制转换, 当输出长度小于字段宽度时, 在前面添加 0 作为填充

    1 #include <stdio.h>
    2 
    3 int main()
    4 {
    5     int i = printf("%20s
    ", "hello world
    ");
    6     printf("%06d
    ", i);
    7     return 0;
    8 }

                输出

            hello world
    
    000021

                #  指定另一种输出格式。 如果为 o 则第一个数字为0(表示八进制), 如果为 x 或 X , 则指定在输出的非0值前加 0x 或 0X (表示十六进制)

    1 #include <stdio.h>
    2 
    3 int main()
    4 {
    5     int i = printf("你好!!!
    ");
    6     printf("%#o
    ", i);
    7     return 0;
    8 }

               输出

    你好!!!
    010

               共 8 个字节, 八进制是  010

    1 #include <stdio.h>
    2 
    3 int main()
    4 {
    5     int i = printf("!!!!!!你好!!!!!
    ");
    6     printf("%#x
    ", i);
    7     printf("%#X
    ", i);
    8     return 0;
    9 }

               输出

    !!!!!!你好!!!!!
    0x10
    0X10

                共 16 个字节, 十六进制是  0x10

    • 一个数值, 用于指定最小字段宽度
     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     printf("%d
    ", 8);
     6     printf("%d
    ", 9);
     7     printf("%d
    ", 10);
     8     printf("%6d
    ", 8);
     9     printf("%6d
    ", 9);
    10     printf("%6d
    ", 10);
    11     return 0;
    12 }

               输出

    8
    9
    10
         8
         9
        10

     当然这里默认是右对齐的

    • 点号,用于分隔字段宽度和精度
    • 表示精度的数
    1 #include <stdio.h>
    2 #define PI 3.1415926535897932384626433832795028841971693993751058209
    3 int main()
    4 {
    5     printf("%30.20f
    ", PI);
    6 }

     输出

            3.14159265358979310000

    可以看出双精度浮点型可以精确到小数点后 16 位左右

             -------------------  宽度和精度中任何一个或者两个都可以用 * 代替, 通过转换下一个参数计算得到(下一个参数必须为 int 类型

    1 #include <stdio.h>
    2 #define PI 3.1415926535897932384626433832795028841971693993751058209
    3 int main()
    4 {
    5     int a = 30, b = 20;
    6     printf("%*.*f
    ", a, b, PI);
    7 }

    当然结果和上面一样

    • 长度修饰符 h , l 或 L 。

              h:将相应的参数按照 short 或 unsigned short 类型输出

              l:将相应的参数按照 long 或 unsigned long 类型输出

              L:将相应的参数按照 long double 类型输出


     printf 函数的转换字符(以 % 开头, 如果 % 后面的字符不是转换字符, 则它行为没有定义)

    转换字符 参数类型, 转换结果
    d, i int, 有符号十进制表示
    o unsigned int, 无符号八进制表示(无前导0)
    x, X unsigned int, 无符号十六进制表示(无前导0x和0X)。如果是0x, 则使用abcdef, 如果是0X, 则使用ABCDEF
    u int, 无符号十进制表示
    c int, 转换为unsigned char类型后为一个字符
    s char *, 打印字符串中的字符, 知道遇到 '' 或者已经打印了有精度指定的字符数
    f double, 形式为 [-]mmm.ddd 的十进制表示, 其中, d的数目由精度确定, 默认精度为6, 精度为0时不输出小数点
    e, E double, 形式为 [-]m.dddddd   e (+/-) xx 或 [-]m.dddddd   E (+/-) xx 的十六进制表示, d的数目由精度确定, 默认为6, 精度为0时不输出小数点
    g, G double, 当指数小于 -4 或大于等于精度时, 采用 %e 或 %E 的格式, 否则采用 %f 的格式, 尾部的0与小数点不打印
    p void *, 打印指针值(具体表示方式与实现有关)
    n int *, 到目前为止, 此printf调用输出的字符的数目将被写入到相应参数中, 不进行参数转换
    % 不进行参数转换, 打印一个符号 %
  • 相关阅读:
    【算法•日更•第三十四期】最大流算法
    【算法•日更•第三十三期】网络流基础知识(最大流)
    【原】Java学习笔记017
    【原】Java学习笔记016
    【原】Java学习笔记015
    【原】Java学习笔记014
    【原】Java学习笔记013
    【原】Java学习笔记012
    【原】Java学习笔记011
    【原】Java学习笔记010
  • 原文地址:https://www.cnblogs.com/xinglichao/p/9182128.html
Copyright © 2020-2023  润新知