本文介绍printf函数的一些特殊的格式控制修饰符

1、域宽修饰符 –> 数字
对所有格式控制符都有效,即便是%%也不例外
宽度修饰符出现在%和格式控制符之间的数字,使数据在固定区域打印。如果待打印的数值不能填满位置,它的左侧会被天上空格以满足填满域宽区域,这些数值是右对齐的;如果超过了给定域宽,输出区域会调整域宽以恰好能容纳该数值,而不会把该数值截断。

#include <stdio.h>int main()
{printf("%2d %2d\n", 0, 1);printf("%2d %2d\n", 2, 3);printf("%2d %2d\n", 12, 34);printf("%2d %2d\n", 123, 456);system("pause");return 0;
}

2、精度修饰符 -> ”. + 数字“
①对于整数格式项%d、%o、%x和%u,精度修饰符指定了它们打印数字的最少位数,要是待打印的数值小于指定位数,那么打印该数值时会在它的前面补0,以凑足指定的位数;要是到打印的数值大于指定位数,那么指定无效,打印该数值的全部位数。

#include <stdio.h>int main()
{printf("%.2d %.2d\n", 0, 1);printf("%.2d %2.d\n", 12, 34);printf("%.2d %.2d\n", 123, 456);system("pause");return 0;
}

②对于%e、%E和%f格式控制符,精度修饰符指定了小数点后应该出现的数字位数,只有当精度大于0时,才会出现小数点。

#include <stdio.h>
#include <math.h>int main()
{double pi = 4 * atan(1.0);printf("%.0f %.1f %.3f %.10f\n", pi, pi, pi, pi);printf("%.0e %.1e %.3e %.10e\n", pi, pi, pi, pi);printf("%.0E %.1E %.3E %.10E\n", pi, pi, pi, pi);system("pause");
    return 0;
}

③对于%g和%G格式控制符来说,惊呆修饰符指定了打印数据中有效数字的位数,如果小数点之后没有数字,那么小数点也不会被打印。

#include <stdio.h>int main()
{printf("%.1g %.1g %.2g %.3g %.8g\n", 1 / 3.0, 10/3.0, 10 / 3.0, 10 / 3.0, 10 / 3.0);printf("%.1G %.1G %.2G %.3G %.8G\n", 1 / 3.0, 10/3.0, 10 / 3.0, 10 / 3.0, 10 / 3.0);system("pause");return 0;
}

④用于%s格式控制符,指定要从相应的字符串中打印的字符个数。当指定的值小于字符串中字符个数时,只输出字符串中的前N个字符(N为精度值),当指定的大于字符串中字符个数时,输出的字符个数为字符串中全部字符的个数。

#include <stdio.h>int main()
{int ret1 = 0;int ret2 = 0;int ret3 = 0;ret1 = printf("%.10s\n", "abcdefg");ret2 = printf("%.5s\n", "abcde");ret3 = printf("%.3s\n", "abcdefg");printf("%d %d %d\n", ret1, ret2, ret3);     system("pause");return 0;
}

3、标志符
①-
此标识符后必须跟有域宽才会有意义,它的作用是使指定了域宽的数据输出时左对齐。

#include <stdio.h>int main()
{printf("%5d%5d%5d\n", 1, 2, 3);printf("%-5d%-5d%-5d\n", 1, 2, 3);system("pause");return 0;
}

②+
规定每个待打印的数值在输出时都应以它的符号(“+”、“-”)作为第一个字符。

#include <stdio.h>int main()
{printf("%+d\n", 1);printf("%+d\n", 0);printf("%+d\n", -1);system("pause");return 0;
}

③空白字符(空格)
如果数值是非负数,就在它的前面添加一个空格。
PS:要是空白字符修饰符与+修饰符出现在一起,以+修饰符为准。

#include <stdio.h>int main()
{printf("% d\n", 1);printf("% d\n", 0);printf("% d\n", -1);printf("% +d\n", 1);system("pause");return 0;
}

④#
%o格式控制符在打印输出时在数字的前面加一个0,%x或%X在打印输出时在数字的最前面加一个0x或0X。

#include <stdio.h>int main()
{printf("%#o\n", 12);printf("%#x\n", 24);printf("%#X\n",24);system("pause");return 0;
}

对浮点数格式来说,#标志符要求小数必须被打印出来,即使小数点之后没有数字,对于%g和%G来说,不会去掉数值尾缀的0.

#include <stdio.h>
#include <math.h>int main()
{printf("%.0f %#.0f %g %#g\n", 3.0, 3.0, 3.0, 3.0);system("pause");return 0;
}

4、%n
%n与其他格式说明符号不同。不向printf传递格式化信息,而是用于指出函数已经打印的字符的个数,这个数被存储在对应参数(整型指针)所指向的整数中。

#include <stdio.h>int main()
{int n = 0;printf("Hello\n%n", &n);printf("%d\n", n);system("pause");return 0;
}

这儿的&n就是我们存储字符个数的整型指针。
PS:是不是赶脚有些像用scanf()给n输入一个值

5、使用 * 替换域宽或精度值

有时候,因为数据的不同,我们可能想使用的域宽或精度值也不同,例如,字符数组里面每次存储的字符个数可能是不同的,那么我们想要不管每次给的字符数是多少,都不用改变printf()函数格式控制字符串里的域宽和精度值该怎么做呢。
因为数值的长度在程序中是写“死”的数字(magic number),那么可能我们经常会这样来定义数组

#define MAXSISE 20
char str[MAXSIZE];

那么为了方便每次打印str里面存储的字符时不用修改printf()函数格式控制字符串里的域宽和精度值,我们可能会这样写:

printf("%MAXSIZE.MAXSIZEs", str);

但是,预处理器的范围不能作用到字符串的内部,所以这样是不可能达到我们的期望的。
而通过一个格式修饰符 * 我们可以很巧妙的做到这一点:

#include <stdio.h>
#define MAXSIZE 20int main()
{char str[MAXSIZE] = "Hello world!";printf("%*.*s\n", 20, 20, str);printf("%*%", 8);system("pause");return 0;
}

这儿用 * 替换域宽和精度值,使printf()的参数列表里依次出现代表域宽的参数和代表精度值的参数,巧妙的避免的预处理器不能作用于字符串内部的问题。

printf函数的格式修饰符相关推荐

  1. java函数修饰符_Java 函数 面向对象,修饰符,类,构造方法,this

    1.函数 函数就是定义在类中,具有特定功能的一段小程序. 在面向对象编程的语言中,函数也叫方法. 2.函数的格式 修饰符 返回值类型 函数名(参数类型 实际参数,....) { 执行语句; retur ...

  2. c语言10位域宽怎么写,C语言格式修饰符洋解

    格式修饰符: 最小域宽限定符: 百分号和格式代码间的整数称为最小域宽限定符,它保证输出时用空格填充以达到最小域宽.默认为空格,如果想用0来填充,那么在域宽限定符前放一个0.如: %05d将对不是五位数 ...

  3. [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)

    简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...

  4. printf()的转换说明修饰符

    一.转换说明 转换说明 输出 %a 浮点数.十六进制数和p记数法(C99/C11),如0x1.f4p+14(float类型数32000.0) %A 浮点数.十六进制数和p记数法(C99/C11) %c ...

  5. 【C语言】printf格式化输出及修饰符总结

    目录 一.不同进制及不同数据类型的转换说明 二.修饰符标识符及其应用场景总结 一.不同进制及不同数据类型的转换说明 转换说明 文字解释 %d:%ld:%lld 打印十进制整形:打印长整形:打印长长整形 ...

  6. solidity:4.函数可见性与修饰符

    一. 函数可见性 public - 支持内部或外部调用 private - 仅在当前合约调用,且不可被继承 internal- 只支持内部调用 external - 不支持内部调用 // SPDX-L ...

  7. 【C语言】printf函数格式控制符

    printf函数的格式控制 说明符: %d:有符号十进制整数 %u:无符号十进制整数 %i:与%d相同 %o:无符号八进制整数(不输出前缀0) %x:无符号十六进制整数(不输出前缀0) %c:输出一个 ...

  8. 修饰符在python函数中的用法详细解释

    python修饰符是实现一个函数嵌套的功能,比较以下两个函数 # -*- coding:utf-8 -*- def a(fn):print 'a'def d(st):print "----- ...

  9. C语言 printf() 函数,总结笔记记录

    道阻且长,行则将至.埋头苦干,不鸣则已,一鸣惊人! 1 printf 函数简介   printf() 和 scanf() 函数,是输入输出函数,或者叫做 I/O 函数.   两个函数,虽然一个是输出, ...

最新文章

  1. 自动挂载ios_Ubuntu自动挂载iso文件 | 学步园
  2. php mysql 字段备注_MySQL下读取 表/字段 的说明备注信息
  3. 下载和安装Nginx之添加Nginx作为系统服务(CentOS7为例)
  4. 载winpcap4.1.1_最常用的11个电缆载流量数据表,建议收藏备用
  5. android缓存框架
  6. 前端智勇大闯关-第二季-第三题
  7. 不想一直做底层码农的请进~
  8. 关于图像格式jpg、gif、png、svg、bmp、WebP的区别以及应用场景
  9. 家庭宽带搭建个人服务器
  10. 疑犯追踪第五季/全集Person of Interest迅雷下载
  11. 看完电影《门锁》感觉脊背发凉,智慧园区带来安全感
  12. 今日头条怎么申请开通原创,怎么快速过新手期
  13. Android三大按钮,模拟Android导航栏三大金刚按键点击
  14. 堆+贪心——nkoj1587【Usaco Nov07 Gold】分配防晒霜
  15. 433模块-----HCS301单片机解码
  16. Android播放本地音频文件
  17. id nil Nil SET IMP 等概念
  18. ELM327 Base Usage
  19. matlab画分形图的具体思路,分形几何中一些经典图形的Matlab画法
  20. HP磁带库LTO-4硬件加密测试

热门文章

  1. 谊品生鲜:放弃传统数据库架构,全站上阿里云
  2. 如何带领团队“攻城略地”?优秀的架构师这样做
  3. 源码|详解分布式事务之 Seata-Client 原理及流程
  4. Objective-C中的associated object释放时机问题
  5. 你们关心十三香不香,我却关心背后的质检稳不稳
  6. 大湾区网络安全大会开幕在即,五个看点揭秘
  7. 如何成功构建大规模 Web 搜索引擎架构?
  8. Docker容器资源管理,你真的学会了吗?
  9. 雅士利牵手阿里云实现新零售改造,双11全渠道成交金额同比增长超过200%
  10. 乘势而起,走进2019年风口“边缘计算”