黑马程序员技术交流社区

标题: 浅谈printf中那不为人知的用法(99%的人不知道) [打印本页]

作者: 正在输入中...    时间: 2015-11-18 23:57
标题: 浅谈printf中那不为人知的用法(99%的人不知道)
今天简单的来总结下,发现很多人对printf的一些特殊功能并不是很清楚。所以总结一下供大家学习交流,如有错误,欢迎大家批评指正。
printf基本的使用,我在这里不说了,那不是本文的重点,下面直接简单粗暴的写上两点干货:

1、在格式化串中添加数字表示使用软约束去拼接字符串。
如:
%15s  本来%s表示输出字符串,但是中间加上一个数字15,表示约束这个字符串为15个字符,之所以说这个约束是软约束,是因为这个约束不是强制的,如果字符串长度小于15,那么这个字符串占则占用15个字节,如果字符串超过了15个字节,字符串不会截断,而是输出实际的长度。

在打印浮点数的时候,会见到如下的写法:
%3.5f  本来%f是打印小数、单精度和双精度都有自己的小数点占用位数,但是中间加了一个小数3.5,其中整数部分3是约束被打印浮点数整数所占位数、小数部分5是约束被打印浮点数小数部分占用位数。需要注意的是,对整数部分的约束为软约束,如果超过的话,不会截断。对小数部分的约束是强制性的约束,超过部分会被截断,并且超过的部分会四舍五入。目前接触到的,只有小数部分的约束是强制性的。

另外还有一种用法就是在格式化输出整数的时候有如下写法:
%06d  原本%d打输出的是整数,%6d的话就是将证书输出的位数限制在6位以内,前面的0表示,如果被打印数没有超过6个字节,那么不够的字节使用0填充,但这里注意,如果要填充,第一位只能是0,如果是其他的值就变成%16d,就是另外的意思了。这个约束也是软约束。

2、printf中的"-"
"-"在printf中的作用是指定格式化输出的对齐方式。
如果什么都不加,默认是右对齐,加上之后就是表示输出的对齐方式是左对齐。


时间不早了,就写到这里。。。。

作者: 正在输入中...    时间: 2015-11-19 00:03
一楼自己占,在补充一点,刚才看有人对转义字符不是很理解,其实很简单:
就是把\后面的字符,不当成是普通的字符,而是将其转换为其他的意思,比如字符n,平常表示字符'n',但是加上\之后就表示换行啦。

常用的可以转义的就那么几个:
\t 制表位
\n 换行
\\ 表示打印一个普通字符\

还有一个比较特殊的就是 打印%号,要用%%。
作者: ToBeJeek1    时间: 2015-11-19 00:59
不常用的不知道也没有关系
作者: yanggangcl    时间: 2015-11-19 07:33
第一个是域宽,第二是左对齐,学了printf都要知道的啦
作者: 爱尘iPhone    时间: 2015-11-19 09:39
说的有点冗长,为什么不直接写代码,加注释,看了会清楚些
作者: lujia1010    时间: 2015-11-19 10:22
不错不错,几个都是很常用的
作者: hngdlll    时间: 2015-11-19 22:09
%06d这样的还真没见过呢,谢谢分享
作者: mr.late    时间: 2015-11-19 22:19
学习。
作者: 陈同英    时间: 2015-11-19 22:38
很好;加油
作者: 正在输入中...    时间: 2015-11-19 23:47
ToBeJeek1 发表于 2015-11-19 00:59
不常用的不知道也没有关系

这可不是不常用,这个东西很常用,特别是格式化的时候。。。。。
作者: 正在输入中...    时间: 2015-11-19 23:48
yanggangcl 发表于 2015-11-19 07:33
第一个是域宽,第二是左对齐,学了printf都要知道的啦

大神见多识广、、、、膜拜。。。。。
作者: 正在输入中...    时间: 2015-11-19 23:49
爱尘iPhone 发表于 2015-11-19 09:39
说的有点冗长,为什么不直接写代码,加注释,看了会清楚些

冗长理解起来其实还可以吧、、、、接受你的建议、、以后在写帖子的时候,尽量上点代码。。。。
作者: a578530825    时间: 2015-11-19 23:50
见过几个了
作者: 韦德460    时间: 2015-11-19 23:52
谢谢分享!
作者: 正在输入中...    时间: 2015-11-19 23:52
hngdlll 发表于 2015-11-19 22:09
%06d这样的还真没见过呢,谢谢分享

恩恩、学到东西就好、、这个帖子就没白写。。。。。
作者: 正在输入中...    时间: 2015-11-19 23:54
lujia1010 发表于 2015-11-19 10:22
不错不错,几个都是很常用的

你的夸奖就是我更新帖子的动力。。。以后多多学习,相互交流。。。。
作者: 打滚的橘子    时间: 2015-11-20 04:21
“-”这个加在哪个位置?%06d是左填充吗?
作者: 正在输入中...    时间: 2015-11-20 23:03
打滚的橘子 发表于 2015-11-20 04:21
“-”这个加在哪个位置?%06d是左填充吗?

“-”放在%后面比如:%-6d 。。
%06d是左填充,在数字的前面补领。。
作者: 正在输入中...    时间: 2015-11-20 23:46
a578530825 发表于 2015-11-19 23:50
见过几个了

我的其他帖子也还不错、、、也可以去看看哦。。。
作者: Breezearrow    时间: 2015-11-20 23:55
格式控制字符串的样式是%[flags][width][.prec][F|N|h|l]type

你提到的属于flags和width
作者: 约吗^_^    时间: 2015-11-21 00:05
标题党,不过不影响赚黑马币
作者: 正在输入中...    时间: 2015-11-21 01:06
约吗^_^ 发表于 2015-11-21 00:05
标题党,不过不影响赚黑马币

你确定你认真看了?为毛出现这个评论、、、难道是传说中的大牛。。。。
作者: 正在输入中...    时间: 2015-11-21 01:08
Breezearrow 发表于 2015-11-20 23:55
格式控制字符串的样式是%[flags][width][.prec][F|N|h|l]type

你提到的属于flags和width ...

还有[.prec]呢把。。。。 大牛很多呀
作者: 打滚的橘子    时间: 2015-11-21 04:26
本帖最后由 打滚的橘子 于 2015-11-21 04:31 编辑
正在输入中... 发表于 2015-11-20 23:03
“-”放在%后面比如:%-6d 。。
%06d是左填充,在数字的前面补领。。

哦哦,老师好像讲过。试过格式控制混用吗?挺有意思的。试试这个printf("-%c-\n",0);打印出来后在--中间键盘移动光标看看。{:2_36:}
作者: 正在输入中...    时间: 2015-11-21 12:32
打滚的橘子 发表于 2015-11-21 04:26
哦哦,老师好像讲过。试过格式控制混用吗?挺有意思的。试试这个printf("-%c-\n",0);打印出来后在--中间键 ...

还真没试过。。。。666666  一会去试下
作者: 正在输入中...    时间: 2015-11-22 21:26
自顶一发。。。。。让更多的人看到。。。。。。
作者: 正在输入中...    时间: 2015-11-23 23:46
正在输入中... 发表于 2015-11-21 01:08
还有[.prec]呢把。。。。 大牛很多呀

给讲讲F N h I 是啥被、。。。。好像木有用过
作者: 刘邓诏初    时间: 2015-11-24 00:01
好棒。。。。。。。
作者: IT-capfer    时间: 2015-11-24 00:21
还是长见识了
作者: 正在输入中...    时间: 2015-11-24 22:35
IT-capfer 发表于 2015-11-24 00:21
还是长见识了

长见识就没白写。。。。哈哈 以后写帖子多多来捧场哈。。。
作者: 刘炼1993    时间: 2015-11-24 22:53
谢谢你  已经实验了一下{:2_31:}{:2_30:}
作者: liuchuan_alex    时间: 2015-11-24 23:09
fuck{:2_30:}
作者: xiaoniu706    时间: 2015-11-24 23:12

作者: zale    时间: 2015-11-24 23:14
加油 努力学习
作者: xiaoniu706    时间: 2015-11-24 23:15
长见识了
作者: 大雕会飞    时间: 2015-11-24 23:22
真是服了,水贴啊
作者: 骑白马的唐僧    时间: 2015-11-24 23:25
怎么说呢,现在来说其实实用性没有那么高了。。
作者: 郭嘉    时间: 2015-11-24 23:30
恩,又学到一招{:2_31:}
作者: Mr.Yan    时间: 2015-11-24 23:33
虽说用的地方不多,单总算也扩展了芝士,赞一个~
作者: 黑马小向    时间: 2015-11-24 23:58
受教了   --!
作者: OnTheWay_1314    时间: 2015-11-26 16:48
很赞哟!加油!
作者: cc_2436    时间: 2015-11-26 22:44
还有sprintf() 和snprintf()
作者: Tactful丶boy    时间: 2015-11-26 22:46
膜拜楼主,学到了
作者: abba008    时间: 2015-11-26 23:47
顶!!!!!!!!!!!
作者: 核酸的双链    时间: 2015-11-27 00:12
好东西,谢谢分享
作者: 眉宇吹过的夏天    时间: 2015-11-27 00:43
好厉害加油啊啊啊啊啊啊啊
作者: 石油小硕    时间: 2015-11-27 01:56
赞一个。。。。
作者: 易沛东    时间: 2015-11-27 12:37
我的脚下拥有的是其余那1%人的领土……




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2