0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文教你搞懂这个不起眼的printf函数

如意 来源:Linux中国 作者:LCTT 郑 2020-09-02 11:59 次阅读

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

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

printf 简史

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

显然,它很受欢迎,但很多人认为它的语法很复杂,尤其是与 echo 或 print 或 cout 等替代的函数相比尤为明显。例如,这是在 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 来输出会产生更多的字符:

$ 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 例子:

string var=“hello\n”;

system.out.printf(“%s”, var);

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

$ 。/example

hello

$

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

#include 《stdio.h》

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 《math.h》

#include 《stdio.h》

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 ,可能会冗长,并且语法相对复杂。这就是为什么开发像 echo 和 cout 之类的快捷方式的原因。不过,如果你时不时地使用 printf ,你就会习惯于这种语法,并且它也会变成你的习惯。我不认为 printf 有任何理由成为你在日常活动中打印时的首选,但是它是一个很好的工具,当你需要它时,它不会拖累你。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • UNIX
    +关注

    关注

    0

    文章

    296

    浏览量

    41463
  • 函数
    +关注

    关注

    3

    文章

    4326

    浏览量

    62558
  • Printf
    +关注

    关注

    0

    文章

    83

    浏览量

    13642
收藏 人收藏

    评论

    相关推荐

    文教程:手把手教你焊接贴片元件

    文教程:手把手教你焊接贴片元件,首先来张全部焊接个点的PCB图
    发表于 04-01 11:03 3.6w次阅读
    图<b class='flag-5'>文教</b>程:手把手<b class='flag-5'>教你</b>焊接贴片元件

    不起眼的led到底还能走多久?

    不起眼的led到底还能走多久?
    发表于 11-05 21:40

    搞懂UPS主要内容

    导读:UPS是系统集成项目中常用到的设备,也是机房必备的设备。本文简单介绍了UPS的种类、功能、原理,品质选择与配置选择方式,基础维护等相关的内容。搞懂UPS本文主要内容:UPS种类、功能
    发表于 09-15 07:49

    篇小短文教你了解工字电感的各项参数

    篇小短文教你了解工字电感的各项参数篇小短文教你了解工字电感的各项参数工字电感是我们在插件作业中会经常看见且用到的电子元器件中的种;
    发表于 02-01 10:16

    printf函数用法示例

    《OpenCV3编程入门》书本配套源代码:printf函数用法示例
    发表于 06-06 15:20 10次下载

    文教你怎么测量压敏电阻的好坏

    本文主要介绍了文教你怎么测量压敏电阻的好坏,“压敏电阻“是种具有非线性伏安特性的电阻器件,主要用于在电路承受过压时进行电压钳位,吸收多余的电流以保护敏感器件。判断压敏电阻通常需要
    发表于 04-10 09:16 7.2w次阅读

    实现重定向printf()和scanf() 函数案例分析

    要想printf()和scanf() 函数工作,我们需要把printf()和scanf() 重新定向到串口中。重定向是指用户可以自己重写C 的库函数,当连接器检查到用户编写了与C 库
    发表于 06-23 08:26 9191次阅读
    实现重定向<b class='flag-5'>printf</b>()和scanf() <b class='flag-5'>函数</b>案例分析

    不起眼的电阻里有哪些学问?

    电阻在我们的工作中比较常见,别小看这不起眼的电阻,里面有很多学问。 贴片电阻(SMD Resistor),又名片式固定电阻器,是种设计为贴片安装的电阻器。 这些SMD电阻器通常比传统的电阻器小得多
    的头像 发表于 03-29 11:35 1461次阅读
    <b class='flag-5'>不起眼</b>的电阻里有哪些学问?

    40篇英语短文教你精通3500个单词

    40篇英语短文教你精通3500个单词
    发表于 08-17 11:13 0次下载

    《51单片机笔记》keilC51软件中printf函数内部机制详解,单片机中怎么使用printf函数printf函数编写程序例子及

    printf函数的讲解
    发表于 11-20 16:51 11次下载
    《51单片机笔记》keilC51软件中<b class='flag-5'>printf</b><b class='flag-5'>函数</b>内部机制详解,单片机中怎么使用<b class='flag-5'>printf</b><b class='flag-5'>函数</b>,<b class='flag-5'>printf</b><b class='flag-5'>函数</b>编写程序例子及

    STM32使用串口重定向系统printf函数输出时出现初始化或使用printf函数系统卡死的原因及解决办法

    STM32使用串口重定向系统printf函数输出时出现初始化或使用printf函数系统卡死的原因及解决办法在STM32开发当中,会经常使用
    发表于 12-09 10:06 13次下载
    STM32使用串口重定向系统<b class='flag-5'>printf</b><b class='flag-5'>函数</b>输出时出现<b class='flag-5'>一</b>初始化或使用<b class='flag-5'>printf</b><b class='flag-5'>函数</b>系统卡死的原因及解决办法

    通过串口利用printf函数输出数据

    printf函数格式printf函数具有强大的输出功能%表示格式化字符串输出目前printf
    发表于 12-28 19:11 11次下载
    通过串口利用<b class='flag-5'>printf</b><b class='flag-5'>函数</b>输出数据

    使用printf函数的安全隐患

    程序员都知道,也都会使用printf函数,但你知道它也有“安全隐患”吗?
    的头像 发表于 10-09 09:49 1924次阅读

    个简单而不起眼的2瓦迷你音频放大器电路

    这是个简单而不起眼的2瓦迷你音频放大器电路,适用于小型袖珍收音机和其他便携式音频小工具。该电路基于菲利普斯半导体IC TDA7052。该放大器甚至可以从 3V 水银纽扣电池运行。这使其成为电池供电小工具的理想选择。
    的头像 发表于 04-02 17:45 3410次阅读
    <b class='flag-5'>一</b>个简单而<b class='flag-5'>不起眼</b>的2瓦迷你音频放大器电路

    stdio.h实现了printf函数?

    我们平时包含的 stdio.h 头文件,里面是不是实现了 printf 函数? 为什么会有这个疑问?因为每次使用 printf,就得包含 stdio.h ,这就导致很多同学误以为,st
    的头像 发表于 12-18 10:28 38次阅读