先记下代码和运行结果

再解释

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. #define PAGES 959
  6. int main(int argc,char* argv)
  7. {
  8. printf("*%d*\n",PAGES);
  9. printf("*%+2d*\n",PAGES);
  10. printf("*%10d*\n",PAGES);
  11. printf("*%-10d*\n",PAGES);
  12. printf("*%010d*\n",PAGES);
  13. printf("*%-010d*\n",PAGES);
  14. printf("*%-010.2d*\n",PAGES);
  15. printf("*%-010.5d*\n",PAGES);
  16. printf("*%010.5d*\n",PAGES);
  17.  
  18. const double RENT = 3852.99;
  19. printf("----------------------------------\n");
  20. printf("*%f*\n",RENT);
  21. printf("*%e*\n",RENT);
  22. printf("*%4.2f*\n",RENT);
  23. printf("*%3.1f*\n",RENT);
  24. printf("*%10.3f*\n",RENT);
  25. printf("*%10.3E*\n",RENT);
  26. printf("*%+4.2f*\n",RENT);
  27. printf("*%010.2f*\n",RENT);
  28. printf("*%-10.2f*\n");
  29.  
  30. return ;
  31. }

结果为:

*959*
*+959*
* 959*
*959 *
*0000000959*
*959 *
*959 *
*00959 *
* 00959*
----------------------------------
*3852.990000*
*3.852990e+03*
*3852.99*
*3853.0*
* 3852.990*
* 3.853E+03*
*+3852.99*
*0003852.99*
*3852.99 *

说明:

首先这三种修饰符,即标记、数字和.数字,他们必须按照这个顺序书写,不能变换顺序。

标记包括5种:+-空格#0

+:表示显示符号位

-:待打印项左对齐,即待打印的项位于整个字段的最左边。这里解释一下,这里所说的字段是指整个转换说明,比如"%-10d",这个字段不仅包括%d表示的数字还包含一些空格位,因为整个字段的长度为10个字符位,如果数字不够则需要用空格填充,默认情况是空格填充在左侧,但是使用了-符号后,数字要左对齐,就是数字出现在最左侧,然后才是补充的空格。

空格:还没明白,明白了再添加

#:用于显示八进制和十六进制的前导符。

0:以0填充。前面说到不足的字符位默认是空格填充,如果使用0标记,则用0填充,当然,0填充只能是在数的前面(左侧)填充,要不然数的大小就变啦!所以当使用-标记表示左对齐的时候0表示是没有作用的。

数字修饰符:用于表示这个字段(前面已经解释了字段的含义)所占的字符位的个数。例如%10d表示这个字段占10位,如果数字本身不足10位则默认情况用空格填充(填充在左侧),如果数字本身已经超过10位,数字标记就不起作用了

.数字修饰符:对于整数,表示整数的最小位数,如%.5d ,如果数字本身的位数小于5位,则会填充0以达到五位数(填充位置自然是数的左侧),如果数本身就大于5位,那么可以认为这个标记不起作用。

      对于浮点数,表示的是小数点右边的数字的位数,默认情况下浮点数好像会显示小数点右边的六位。

这三种修饰符通常情况下会一起使用,分析的时候一定要注意这三个修饰符出现的顺序一定是先标记再数字最后是点数字(当然其中一项或多项没有可以不使用)。牢记这一点然后再分析就容易了。

11月26日添加:

对于标记空格的理解:

先给出代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc,char* argv)
  4. {
  5.  
  6. printf("%d\t%d\t%d\t%d\t%d\t%d\n",,,,-,);
  7. printf("%d\t%d\t%d\t%d\t%d\t%d\n",-,,-,,,);
  8. printf("----------------------------------------------------------------------------------------------------------------------\n\n\n");
  9.  
  10. // 添加数字标记使每个字段占用的字符位数相同
  11. printf("%9d\t%9d\t%9d\t%9d\t%9d\t%9d\n",,,,-,);
  12. printf("%9d\t%9d\t%9d\t%9d\t%9d\t%9d\n",-,,-,,,);
  13. printf("----------------------------------------------------------------------------------------------------------------------\n\n\n");
  14.  
  15. //添加-标记,使数字作对其
  16. printf("%-9d\t%-9d\t%-9d\t%-9d\t%-9d\t%-9d\n",,,,-,);
  17. printf("%-9d\t%-9d\t%-9d\t%-9d\t%-9d\t%-9d\n",-,,-,,,);
  18. printf("----------------------------------------------------------------------------------------------------------------------\n\n\n");
  19.  
  20. //添加空格标记,使正数前面生成前导空格
  21. printf("% -9d\t% -9d\t% -9d\t% -9d\t% -9d\t% -9d\n",,,,-,);
  22. printf("% -9d\t% -9d\t% -9d\t% -9d\t% -9d\t% -9d\n",-,,-,,,);
  23. printf("----------------------------------------------------------------------------------------------------------------------\n\n\n");
  24.  
  25. //多个空格呢,会当成一个空格来处理
  26. printf("% -9d\t% -9d\t% -9d\t% -9d\t% -9d\t% -9d\n",,,,-,);
  27. printf("% -9d\t% -9d\t% -9d\t% -9d\t% -9d\t% -9d\n",-,,-,,,);
  28. printf("----------------------------------------------------------------------------------------------------------------------\n\n\n");
  29.  
  30. //空格标记和-标记的顺序调换一下
  31. printf("%- 9d\t%- 9d\t%- 9d\t%- 9d\t%- 9d\t%- 9d\n",,,,-,);
  32. printf("%- 9d\t%- 9d\t%- 9d\t%- 9d\t%- 9d\t%- 9d\n",-,,-,,,);
  33. printf("----------------------------------------------------------------------------------------------------------------------\n\n\n");
  34.  
  35. return ;
  36. }

运行结果:

说明: 在转换说明中使用空格标记的作用是:在输出的正值前面生成前导空格,负值前面不产生前导空格,这样输出的结果比较美观。

打印多行数据的时候,我们经常使用\t 来控制输出,使输出更加美观。但是当数字的位数大于8的时候,用\t也不能完全解决(第一种代码)。这时我们可以在转换说明中加入数字修饰(第二种代码),来控制每个字段所占字符的位数,我们发现,这种情况比上一种情况美观了很多。但是有时候我们希望数据左对齐而不是右对齐,这时我们就可以在转换说明中使用-标记(第三种代码),采用的第三种代码后,我们发现,输出更加美观了,但是仍然存在一个小的瑕疵,就是正数和负数不能对其,这个时候我们可以在转换说明中再加入空格标记(第四种代码),使得输出更加美观。最后我们测试了一下使用多个空格作为标记,发现效果和使用一个空格是一样的(第五种代码),也就是说转换说明中使用空格标记,多个空格都被视为一个空格。最后我们还将空格标记和-标记的位置进行了调换(第六种代码),发现和第五种情况一样。说明,在转换说明中使用标记时,对五种标记的顺序没有要求,但是切记,正如前面一再强调的那样,标记修饰一定要在数字修饰的前面,数字修饰一定要在.数字修饰的前面。

补充:

对于整型变量来说,当0标记和.数字修饰同时使用时,零标记将失去作用。

printf()的转换说明的修饰符中的标记、数字、和.数字的更多相关文章

  1. Java中volatile修饰符,不稳定标记的用法笔记

    今天学java特性时,发现了volatile修饰符,这个修饰符修饰的变量告诉java编译器忽略优化机制,这样的优势是: java优化后,寄存器会缓存内存里的变量,另一个线程修改这个变量的内存时,不会同 ...

  2. php中的修饰符

    上面使用了一个修饰符U,详见关于修饰符的介绍. PHP正则表达式修饰符的理解: 在PHP正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这 ...

  3. as3 中 final 修饰符

    现在,在ActionScript 3.0的修饰符中,只有final修饰符没有介绍.之所有放在这里介绍,是因为final修饰符只与继承有关,指定一个方法不能被重写或一个类不能被继承. 一般来说,当用fi ...

  4. @property的4类修饰符

    一.读写性修饰符:readwrite | readonly readwrite:表明这个属性是可读可写的,系统为我们创建这个属性的setter和getter方法. readonly:表明这个属性只能读 ...

  5. PHP 正则表达式 修饰符

    下面列出了当前可用的 PCRE 修饰符.括号中提到的名字是 PCRE 内部这些修饰符的名称. 模式修饰符中的空格,换行符会被忽略,其他字符会导致错误. i (PCRE_CASELESS) 如果设置了这 ...

  6. PHP正则表达式模式修饰符详解

    PHP模式修饰符又叫模式修正符,是在正则表达式的定界符之外使用.主要用来调整正则表达式的解释,提扩展了正则表达式在匹配.替换等操作的某些功能,增强了正则的能力.但是有很多地方的解释都是错误的,也容易误 ...

  7. PHP正则表达式模式修饰符 /i, /is, /s, /isU等

    模式修饰符 下面列出了当前可用的 PCRE 修饰符.括号中提到的名字是 PCRE 内部这些修饰符的名称. 模式修饰符中的空格,换行符会被忽略,其他字符会导致错误. i (PCRE_CASELESS) ...

  8. C# JAVA成员访问修饰符比较

    在面向对象的访问修饰符中常用的有public ,private ,protected C# 访问修饰符: private < protected internal < internal/p ...

  9. 从零开始学 Web 之 Vue.js(二)过滤器,按键修饰符,自定义指令

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

随机推荐

  1. ABP 基础设施层——集成 Entity Framework

    本文翻译自ABP的官方教程<EntityFramework Integration>,地址为:http://aspnetboilerplate.com/Pages/Documents/En ...

  2. SED 学习笔记

    1. Sed简介   sed是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成 ...

  3. Sql Server 2008 压缩数据库日志文件

    第一步:将数据库设置为简单模式 选中数据库点右键->属性: 第二步:收缩数日志文件 1, 2,   第三步:将恢复模式改回为完整模式     如果你觉得用UI界面麻烦,那你就用SQL语句吧   ...

  4. Jersey Client传递中文参数

    客户端需要客户端的包: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jerse ...

  5. supervisor配置环境变量(PATH)

    app配置中增加: environment=PATH="/PATH/TO/anaconda3/bin" supervisord在linux中启动默认继承了linux的环境变量,在这 ...

  6. 关于Java_Web连接Oracle数据库

    1.前提条件 1>装有Oracle数据库(因为连接的时候需要开启两项服务) 2>myeclipse或eclipse(支持WebProject的版本)开发环境,本机以myeclipse为例, ...

  7. MPU6050学习笔记(电源管理器1、2)

    Technorati Tags: 嵌入式开发.模块开发 寄存器107号:电源管理器1 PWR_MGMT_1: Description: This register allows the user to ...

  8. 在ASP.NET MVC中使用区域来方便管理controller和view

    在ASP.NET MVC中使用区域来方便管理controller和view 在mvc架构中,一般在controllers和views中写所有控制器和视图, 太多控制器时候,为了方便管理,想要将关于pe ...

  9. Day 12 装饰器,开发封闭.

    一.什么是装饰器 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事务 ...

  10. jzoj5878

    tj:這道題可以想到排列組合 對於第一問,我們知道,左轉的次數比右轉次數多4,所以答案是c(n,n/2-2) 對於第二問,我們發現,不能出現下凹的情況,所以不能同時出現2個左拐,且路徑可以分為4段,且 ...