当前位置: 首页 > 科技观察

如何使用printf格式化输出

时间:2023-03-14 17:25:18 科技观察

刚开始学习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$但是,当变量的内容发生变化时,乐趣就来了。假设您想根据递增的数字更新输出:#includeintmain(){intvar=0;while(var<100){var++;printf("Processingis%d%finished.\n",var);}return0;}编译运行:Processingis1%finished.[...]Processingis100%finished。请注意,代码中的两个%将被解释为打印的%符号。使用printf限制小数位数也可能很复杂,它提供了许多格式化选项。您可以使用浮点数上的%f来限制打印的小数位数。您可以通过在百分号和f之间放置一个句点(.)和一个限制数字来告诉printf要打印多少位小数。下面是一个用Bash编写的简单简洁示例:$printf"%.2f\n"3.1415193.14$类似的语法也适用于其他语言。下面是一个C语言的例子:#include#includeintmain(){fprintf(stdout,"%.2f\n",4*atan(1.0));return0;}for对于三位小数,使用.3f,依此类推。使用printf为数字添加逗号因为大数字难以阅读,所以通常使用逗号来分隔大数字。您可以在百分号和d之间放置一个撇号('),以便printf根据需要添加逗号:$printf"%'d\n"10241,024$printf"%'d\n"10246011,024,601$使用printf到前缀零printf的另一个常见用途是强制文件名中数字的特定格式。例如,如果您在一台计算机上按顺序排列10个文件,计算机可能会将10.jpg排在1.jpg之前,这可能不是您想要的。当您以编程方式写入文件时,您可以使用printf来形成文件名,其中包含以0为前缀的字符。这是一个用Bash编写的简单简洁示例:$printf"%03d.jpg\n"{1..10}001.jpg002.jpg[...]010.jpg注意:每个号码最多使用3位数字。使用printf如这些printf示例所示,包括控制字符(尤其是\n)可能会很冗长,语法也相对复杂。这就是开发像echo和cout这样的快捷方式的原因。但是,如果您时不时地使用printf,就会习惯这种语法,并且它会成为您的习惯。在日常活动中打印时,我看不出为什么printf应该是您的首选,但它是一个很棒的工具,在您需要它时不会让您感到压力。花一些时间用您选择的语言学习printf,并在需要时使用它。这是一个强大的工具,触手可及,您不会后悔的。