刚开始学习Unix的时候,很早就接触到了echo命令。同样,我最初的Python课程涉及打印功能。让我想起了我在学习C++和Java的时候学过的cout和systemout。似乎每一种语言都自豪地声称拥有一种方便的单行输出方法,并宣传它好像它即将过时一样。但是当我打开中级教程的第一页时,我遇到了printf,一个晦涩难懂、神秘莫测、却出奇灵活的函数。这篇文章,一个逆向初学者对隐藏printf的执着传统,旨在介绍这个不起眼的printf函数,并解释如何在几乎任何语言中使用它。printf简史术语printf代表“打印格式”,它可能最早出现在Algol68编程语言中。自从合并到C中以来,printf一次又一次地在C++、Java、Bash、PHP中重新实现,并且很可能再次在您最喜欢的“后C”语言中重新实现。显然,它很流行,但很多人发现它的语法很复杂,尤其是与echo或print或cout等替代函数相比时。例如,下面是Bash中的一个简单的echo语句:$echohellohello$下面是在Bash中使用printf的相同结果:$printf"%s\n"hellohello$但是随着复杂性的增加,您将拥有强大的力量,这就是确切的原因为什么printf值得学习。printf输出printf背后的基本思想是它能够根据与内容分开的样式信息来格式化输出。例如,这是printf识别为特殊字符的一组特定序列。你喜欢的语言可能有或多或少的序列,但通常包括:\n:新行\r:回车换行\t:水平制表符\NNN:包含一到三个数字的字符串,使用八进制值特殊字节由eg表示:$printf"\t\123\105\124\110\n"SETH$在此Bash示例中,在printf呈现一个制表符之后,紧接着是分配给四个八进制值ASCII字符的字符串,并以一个控制序列终止生成一个新行(\n)。如果你也使用echo输出更多的字符:$printf"\t\123\105\124\110\n"\t\123\105\124\110\n$使用Python的print函数完成同样的任务,你会发现Python的print命令比你想象的更强大:>>>print("\t\123\n")S>>>很明显,Python的print包括了传统的printf特性以及简单的echo或cout的特性。但是,这些示例仅包括文字字符,这可能是printf中最不重要的部分,尽管它们在某些情况下也很有用。printf的真正威力在于格式化指令。使用printf格式化输出格式说明符是以百分号(%)开头的字符。常见的格式说明符包括:%s:字符串%d:数字%f:浮点数%o:八进制数这些格式说明符是printf语句的占位符,你可以在其他地方使用提供值来替换你的printf语句中的占位符.在何处提供这些值取决于您使用的语言及其语法,这里是一个简单的Java示例:stringvar="hello\n";system.out.printf("%s",var);将此代码包装在适当的样板中,执行后将呈现:$./examplehello$但是,当变量的内容发生变化时,乐趣就来了。假设您想根据递增的数字更新输出:#include
