如何使用 printf 来格式化输出
创始人
2024-03-02 05:44:13
0

来了解一下 printf ,一个神秘的、灵活的和功能丰富的函数,可以替换 echo、print 和 cout。

当我开始学习 Unix 时,我很早就接触到了 echo 命令。同样,我最初的 Python 课程也涉及到了 print 函数。再想起学习 C++ 和 Java 时学到 coutsystemout。似乎每种语言都骄傲地宣称拥有一种方便的单行输出方法,并生怕这种方式要过时一样宣传它。

但是当我翻开中级教程的第一页后,我遇到了 printf,一个晦涩难懂的、神秘莫测的,又出奇灵活的函数。本文一反向初学者隐藏 printf 这个令人费解的传统,旨在介绍这个不起眼的 printf 函数,并解释如何在几乎所有语言中使用它。

printf 简史

术语 printf 代表“ 格式化打印 print formatted ”,它可能最早出现 Algol 68 编程语言中。自从它被纳入到 C 语言后,printf 已经在 C++、Java、Bash、PHP 中一次次重新实现,并且很可能在你最喜欢的 “后 C” 语言中再次出现。

显然,它很受欢迎,但很多人认为它的语法很复杂,尤其是与 echoprintcout 等替代的函数相比尤为明显。例如,这是在 Bash 中的一个简单的 echo 语句:

$ echo hello
hello
$

这是在 Bash 中使用 printf 得到同样结果:

$ printf "%s\n" hello
hello
$

但是所增加的复杂性反而让你拥有很多功能,这是为什么 printf 值得学习的确切原因。

printf 输出

printf 背后的基本思想是:它能够基于与内容分离的样式信息来格式化输出。例如,这里是 printf 认可的视作特殊字符的特定序列集合。你喜欢的语言可能会有或多或少的序列,但是通常包含:

  • \n: 新行
  • \r: 回车换行
  • \t: 水平制表符
  • \NNN: 一个包含一个到三个数字,使用八进制值表示的特殊字节

例如:

$ printf "\t\123\105\124\110\n"
     SETH
$

在这个 Bash 示例中, printf 渲染一个制表符后,然后是分配给四个八进制值字符串的 ASCII 字符,并以一个生成一个新行(\n)的控制序列结束。

如果同样使用 echo 来输出会产生更多的字符:

$ echo "\t\123\105\124\110\n"
\t\123\105\124\110\n
$

使用 Python 的 print 函数来完成同样的任务,你会发现 Python 的 print 命令比你想象的要强大:

>>> print("\t\123\n")
        S

>>>

显然,Python 的 print 包含传统的 printf 特性以及简单的 echocout 的特性。

不过,这些示例包括的只是文字字符,尽管在某些情况下它们也很有用,但它们可能是 printf 最不重要的部分。printf 的真正的威力在于格式化说明。

使用 printf 格式化输出

格式化说明符是以一个百分号(%)开头的字符。

常见的格式化说明符包括:

  • %s: 字符串
  • %d: 数字
  • %f: 浮点数字
  • %o: 一个八进制的数字

这些格式化说明符是 printf 语句的占位符,你可以使用一个在其它地方提供的值来替换你的 printf 语句中的占位符。这些值在哪里提供取决于你使用的语言和它的语法,这里有一个简单的 Java 例子:

string var="hello\n";
system.out.printf("%s", var);

把这个代码包裹在适当的样板文件中,在执行后,将呈现:

$ ./example
hello
$

但是,当一个变量的内容更改时,有意思的地方就来了。假设你想基于不断增加的数字来更新输出:

#include 

int main() {
  int var=0;
  while ( var < 100) {
    var++;
  printf("Processing is %d% finished.\n", var);
  }
  return 0;
}

编译并运行:

Processing is 1% finished.
[...]
Processing is 100% finished.

注意,在代码中的两个 % 将被解析为一个打印出来的 % 符号。

使用 printf 限制小数位数

数字也可以是很复杂,printf 提供很多格式化选项。你可以对浮点数使用 %f 限制打印出多少个小数位。通过把一个点(.)和一个限制的数放置在百分符号和 f 之间, 你可以告诉 printf 打印多少位小数。这是一个简单的用 Bash 写的简练示例:

$ printf "%.2f\n" 3.141519
3.14
$

类似的语法也适用于其它的语言。这里是一个 C 语言的示例:

#include 
#include 

int main() {
  fprintf(stdout, "%.2f\n", 4 * atan(1.0));
  return 0;
}

对于三位小数,使用 .3f ,依次类推。

使用 printf 来在数字上添加逗号

因为位数大的数字很难解读,所以通常使用一个逗号来断开大的数字。你可以在百分号和 d 之间放置一个撇号('),让 printf 根据需要添加逗号:

$ printf "%'d\n" 1024
1,024
$ printf "%'d\n" 1024601
1,024,601
$

使用 printf 来添加前缀零

printf 的另一个常用的用法是对文件名称中的数字强制实行一种特定的格式。例如,如果你在一台计算机上有 10 个按顺序排列的文件,计算机可能会把 10.jpg 排在 1.jpg 之前,这可能不是你的本意。当你以编程的方式写一个到文件时,你可以使用 printf 来用前缀为 0 的字符形成文件名称。这是一个简单的用 Bash 写的简练示例:

$ printf "%03d.jpg\n" {1..10}
001.jpg
002.jpg
[...]
010.jpg

注意:每个数字最多使用 3 位数字。

使用 printf

正如这些 printf 示例所显示,包括控制字符,尤其是 \n ,可能会冗长,并且语法相对复杂。这就是为什么开发像 echocout 之类的快捷方式的原因。不过,如果你时不时地使用 printf ,你就会习惯于这种语法,并且它也会变成你的习惯。我不认为 printf 有任何理由成为你在日常活动中打印时的首选,但是它是一个很好的工具,当你需要它时,它不会拖累你。

花一些时间学习你所选择语言中的 printf,并且当你需要时就使用它。它是一个强有力的工具,你不会后悔随时可用的工具。


via: https://opensource.com/article/20/8/printf

作者:Seth Kenlon 选题:lujun9972 译者:robsean 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

智谱宣布开源视觉推理模型G...
凤凰网科技讯 8月11日,智谱AI推出全球100B级效果最佳的开源...
2025-08-16 19:15:50
华为盘古大模型首次开源!昇...
克雷西 发自 凹非寺 量子位 | 公众号 QbitAI 华为盘古大...
2025-07-02 21:12:24
原创 ...
多模态大模型正在从“看得见”走向“看得懂、想得通”。 智谱正式发布...
2025-07-02 15:40:54
MiniMax深夜开源!首...
智东西 作者 | 程茜 编辑 | 心缘 智东西6月17日报道,今日...
2025-06-17 13:43:17
VS2022配置工程的编译...
VS2022配置工程的编译路径(输出目录和中间目录&...
2025-06-01 19:24:39
Flink- 物理分区、S...
物理分区         随机分区(shuffle&...
2025-06-01 15:16:47

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...
如何检查你的 Linux 系统... 不知道在使用哪个初始化系统?以下是方法。每个主流 Linux 发行版(包括 Ubuntu、Fedor...