先记下代码和运行结果
再解释
#include <stdio.h> #include <stdlib.h> #include <limits.h> #define PAGES 959 int main(int argc,char* argv) { printf("*%d* ",PAGES); printf("*%+2d* ",PAGES); printf("*%10d* ",PAGES); printf("*%-10d* ",PAGES); printf("*%010d* ",PAGES); printf("*%-010d* ",PAGES); printf("*%-010.2d* ",PAGES); printf("*%-010.5d* ",PAGES); printf("*%010.5d* ",PAGES); const double RENT = 3852.99; printf("---------------------------------- "); printf("*%f* ",RENT); printf("*%e* ",RENT); printf("*%4.2f* ",RENT); printf("*%3.1f* ",RENT); printf("*%10.3f* ",RENT); printf("*%10.3E* ",RENT); printf("*%+4.2f* ",RENT); printf("*%010.2f* ",RENT); printf("*%-10.2f* "); return 0; }
结果为:
*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日添加:
对于标记空格的理解:
先给出代码:
#include <stdio.h> #include <stdlib.h> int main(int argc,char* argv) { printf("%d %d %d %d %d %d ",32,950,621,-123456789,122); printf("%d %d %d %d %d %d ",-32,12,-95,22,12,111); printf("---------------------------------------------------------------------------------------------------------------------- "); // 添加数字标记使每个字段占用的字符位数相同 printf("%9d %9d %9d %9d %9d %9d ",32,950,621,-123456789,122); printf("%9d %9d %9d %9d %9d %9d ",-32,12,-95,22,12,111); printf("---------------------------------------------------------------------------------------------------------------------- "); //添加-标记,使数字作对其 printf("%-9d %-9d %-9d %-9d %-9d %-9d ",32,950,621,-123456789,122); printf("%-9d %-9d %-9d %-9d %-9d %-9d ",-32,12,-95,22,12,111); printf("---------------------------------------------------------------------------------------------------------------------- "); //添加空格标记,使正数前面生成前导空格 printf("% -9d % -9d % -9d % -9d % -9d % -9d ",32,950,621,-123456789,122); printf("% -9d % -9d % -9d % -9d % -9d % -9d ",-32,12,-95,22,12,111); printf("---------------------------------------------------------------------------------------------------------------------- "); //多个空格呢,会当成一个空格来处理 printf("% -9d % -9d % -9d % -9d % -9d % -9d ",32,950,621,-123456789,122); printf("% -9d % -9d % -9d % -9d % -9d % -9d ",-32,12,-95,22,12,111); printf("---------------------------------------------------------------------------------------------------------------------- "); //空格标记和-标记的顺序调换一下 printf("%- 9d %- 9d %- 9d %- 9d %- 9d %- 9d ",32,950,621,-123456789,122); printf("%- 9d %- 9d %- 9d %- 9d %- 9d %- 9d ",-32,12,-95,22,12,111); printf("---------------------------------------------------------------------------------------------------------------------- "); return 0; }
运行结果:
说明: 在转换说明中使用空格标记的作用是:在输出的正值前面生成前导空格,负值前面不产生前导空格,这样输出的结果比较美观。
打印多行数据的时候,我们经常使用 来控制输出,使输出更加美观。但是当数字的位数大于8的时候,用 也不能完全解决(第一种代码)。这时我们可以在转换说明中加入数字修饰(第二种代码),来控制每个字段所占字符的位数,我们发现,这种情况比上一种情况美观了很多。但是有时候我们希望数据左对齐而不是右对齐,这时我们就可以在转换说明中使用-标记(第三种代码),采用的第三种代码后,我们发现,输出更加美观了,但是仍然存在一个小的瑕疵,就是正数和负数不能对其,这个时候我们可以在转换说明中再加入空格标记(第四种代码),使得输出更加美观。最后我们测试了一下使用多个空格作为标记,发现效果和使用一个空格是一样的(第五种代码),也就是说转换说明中使用空格标记,多个空格都被视为一个空格。最后我们还将空格标记和-标记的位置进行了调换(第六种代码),发现和第五种情况一样。说明,在转换说明中使用标记时,对五种标记的顺序没有要求,但是切记,正如前面一再强调的那样,标记修饰一定要在数字修饰的前面,数字修饰一定要在.数字修饰的前面。
补充:
对于整型变量来说,当0标记和.数字修饰同时使用时,零标记将失去作用。