C陷阱与缺陷(四)PRINTF , VARARGS与 STDARG、Koenig和 Moo夫妇访谈

本文深入探讨了C语言中的printf函数族,包括格式类型、修饰符、标志以及可变参数列表的实现。详细介绍了%d、%u、%o、%x等格式项的用途,以及如何使用varargs.h和stdarg.h处理可变参数。同时,强调了库的重要性超过语言细节,并给出了Koenig和Moo夫妇关于C++编程的建议。
摘要由CSDN通过智能技术生成

附录A:PRINTF , VARARGS与 STDARG

A.1 printf 函数族

简单格式类型

        因为格式字符串决定了其余参数的类型,而且可以到运行时才建立格式字符串,所以C语言实现要检查printf 函数的参数类型是否正确是异常困难的。

        其中的%d格式项将被对应的待输出整数的10进制值替换,替换时不会在整数值的前后添加空格字符。

        %u格式项与%d格式项类似,只不过要求打印无符号10进制整数。

        %o、%x和%X格式项用于打印8进制或16进制的整数。

        %s格式项所对应输出的字符串必须以一个空字符('\0')作为结束标志

        %og、%f 和%e这3个格式项用于打印浮点值。

        %g格式项用于打印那些不需要按列对齐的浮点数特别有用。它在打印出对应的数值(必须为浮点型或双精度类型)时,会去掉该数值尾缀的零,保留六位有效数字。

        占用的空间大小相同。对于比较小的数值,除非该数的指数小于或等于-5,%g格式项才会采用科学计数法来表示。

        %e格式项用于打印浮点数时,要求一律显式地使用指数形式:π在使用%e格式项时将被写成3.141593e+00。%e格式项将打印出小数点后6位有效数字,而并非如%g 格式项打印出的数是总共6位有效数字

        %f格式项则恰好相反,强制禁止使用指数形式来表示浮点数,因此π就被写成3.141593。在数值精度方面,%f格式项的要求与%e格式项相同,即小数点后6位有效数字。

        %E和%G格式项与它们对应的%e和%g格式项在行为方式上基本相同,除了用大写的E代替了小写的e来表示指数形式。

        %%格式项用于打印出一个%字符。

修饰符

        整数有3种不同类型,对应3种不同长度:short,long和正常长度。如果一个short整数作为任何一个函数(也包括printf函数)的参数出现,它会被自动地扩展为一个正常长度的整数。但是,我们仍然需要一种方式,来通知printf 函数某个参数是long型整数。我们可以在格式码之前紧挨着插入一个长度修饰符l,创造出%ld、% lo、%lx和%lu作为新的格式码。

        利用宽度修饰符,我们可以轻松做到在固定长度的域内打印数值。宽度修饰符出现在%符号和格式码的中间,其作用是指定它所修饰的格式项所应打印的字符数。如果待打印的数值不能填满位置,它的左侧就会被补上空格字符以使这个数值的宽度满足要求。

        精度修饰符的确切含义与格式码有关:

        对于整数格式项%d、%o、%x和%u,精度修饰符指定了打印数字的最少位数。如果待打印的数值并不需要这么多位数的数字来表示,就会在它的前面补上0。因此,

        对于%e、%E和%f 格式项,精度修饰符指定了小数点后应该出现的数字位数。除非标志另有说明,仅当精度大于0时打印的数值中才会实际出现小数点。

        对于%g 和%G格式项,精度修饰符指定了打印数值中的有效数字位数。除非标志另有说明,非有效数字的0将被去掉,如果小数点后不跟数字则小数点也将被删除。

        对于%s格式项,精度修饰符指定了将要从相应的字符串中打印的字符数。如果该字符串中包含的字符数少于精度修饰符所指定的字符数,输出的字符数就会少于精度修饰符指定的数目。如果需要,我们可以通过域宽修饰符来加长输出。

        对于%c和%%格式项,精度修饰符将被忽略。

标志

        在显示宽度大于被显示位数时,数据尾部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值