欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言printf格式化输出

程序员文章站 2022-07-15 09:26:56
...

格式化规定符:

%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数  
%x  %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数(注意是字母欧,不是零)  
%g 自动选择合适的表示法

对于规定符的一些说明:

1、对于%d:

  • %md: 指定输出的宽度。数据位数小于m,左端补空格;大于m,按实际位数输出。比如说%3d 表示输出3位 整型数,不够3位右对齐。若想在输出值前加一些0, 就应在场宽项前加个0。例如%04d 表示在输出一个小于4 位的数值时,将在前面补0使其总宽度为4位。
  • %ld: 输出长整型数据。
  • %-md:可以控制输出左对齐,没有则说明右对齐。

2、对于%f:

  • %m.nf:表示最大场宽为m,小数位为n,整数为则为m-n-1,不够m为右对齐。 例如:%6.2f表示输出场宽为9的浮点数,小数点后保留2为小数,整数位为3位,小数点占一位。
  • %-m.nf:表示可以控制输出左对齐。
  • %lf:表示输出double型浮点数。

3、对于%s

  • %-5s:表示输出5个字符左对齐,没有负号则右对齐。
  • %6.9s:表示一个长度不小于6且不大于9的字符串,若大于9,则第9个后面的字符将被删除。


4、对于%x

  • 在编程语言中我们经常看见0x100000等0x代表是16进制后面的16进制的数值,然后一般16进制的数值代表内存地址

  • 例如

    #include <stdio.h>
    
    int main(){
        int address;
        printf("%0x", address);
       
        return 0;
    }
    

    会出现如下错误

    Error: Memory space at 0x100000(object ‘address’) is not initialized
    printf("%0x", address);

    ^^^^^^^^^^^^^^^^^^^

    意思就是对象address(就是你定义的变量address)在内存地址的0x100000位置没有初始化,导致在输出的时候出错。

多在错误中采坑积攒经验,快速成长


printf格式输出数字,位数不够前面补0

printf格式输出:%[flags][width][.perc][F|N|h|l]type

用到了flags中的 0 (注意是零不是字母欧) ,将输出的前面补上0,直到占满指定列宽为止(不可以搭配使用)

width 即表示需要输出的位数。

例如:

#include <stdio.h>
int main(){
    int a=5;
    printf(%03d, a);
    return 0;
}

输出005


也可以用 * 代替位数,在后面的参数列表中用变量控制输出位数;

#include <stdio.h>
int main(){
    int a=5,n=3;
    printf(%0*d,n,a);
    return 0;
}

输出005


实际应用举例

世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

输入格式:

输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。

输出格式:

在一行中按照“yyyy-mm-dd”的格式给出年、月、日。

输入样例:

09-15-2019

输出样例:

2019-09-15

代码实现

#include <stdio.h>

int main(){
    int month,day,year;
    scanf("%d-%d-%d",&month,&day,&year);

    printf("%d-%02d-%02d", year,month,day);
    return 0;
}

还有输出一些学号,编号等