0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文教你搞懂這個(gè)不起眼的printf函數(shù)

如意 ? 來源:Linux中國(guó) ? 作者:LCTT 鄭 ? 2020-09-02 11:59 ? 次閱讀

當(dāng)我開始學(xué)習(xí) Unix 時(shí),我很早就接觸到了 echo 命令。同樣,我最初的 Python 課程也涉及到了 print 函數(shù)。再想起學(xué)習(xí) C++Java 時(shí)學(xué)到 cout 和 systemout。似乎每種語言都驕傲地宣稱擁有一種方便的單行輸出方法,并生怕這種方式要過時(shí)一樣宣傳它。

但是當(dāng)我翻開中級(jí)教程的第一頁后,我遇到了 printf,一個(gè)晦澀難懂的、神秘莫測(cè)的,又出奇靈活的函數(shù)。本文一反向初學(xué)者隱藏 printf 這個(gè)令人費(fèi)解的傳統(tǒng),旨在介紹這個(gè)不起眼的 printf 函數(shù),并解釋如何在幾乎所有語言中使用它。

printf 簡(jiǎn)史

術(shù)語 printf 代表“格式化打印print formatted”,它可能最早出現(xiàn) Algol 68 編程語言中。自從它被納入到 C 語言后,printf 已經(jīng)在 C++、Java、Bash、PHP 中一次次重新實(shí)現(xiàn),并且很可能在你最喜歡的 “后 C” 語言中再次出現(xiàn)。

顯然,它很受歡迎,但很多人認(rèn)為它的語法很復(fù)雜,尤其是與 echo 或 print 或 cout 等替代的函數(shù)相比尤為明顯。例如,這是在 Bash 中的一個(gè)簡(jiǎn)單的 echo 語句:

$ echo hello

hello

$

這是在 Bash 中使用 printf 得到同樣結(jié)果:

$ printf “%s\n” hello

hello

$

但是所增加的復(fù)雜性反而讓你擁有很多功能,這是為什么 printf 值得學(xué)習(xí)的確切原因。

printf 輸出

在 printf 背后的基本思想是:它能夠基于與內(nèi)容分離的樣式信息來格式化輸出。例如,這里是 printf 認(rèn)可的視作特殊字符的特定序列集合。你喜歡的語言可能會(huì)有或多或少的序列,但是通常包含:

\n: 新行

\r: 回車換行

\t: 水平制表符

\NNN: 一個(gè)包含一個(gè)到三個(gè)數(shù)字,使用八進(jìn)制值表示的特殊字節(jié)

例如:

$ printf “\t\123\105\124\110\n”

SETH

$

在這個(gè) Bash 示例中, printf 渲染一個(gè)制表符后,然后是分配給四個(gè)八進(jìn)制值字符串的 ASCII 字符,并以一個(gè)生成一個(gè)新行(\n)的控制序列結(jié)束。

如果同樣使用 echo 來輸出會(huì)產(chǎn)生更多的字符:

$ printf “\t\123\105\124\110\n”

\t\123\105\124\110\n

$

使用 Python 的 print 函數(shù)來完成同樣的任務(wù),你會(huì)發(fā)現(xiàn) Python 的 print 命令比你想象的要強(qiáng)大:

》》》 print(“\t\123\n”)

S

》》》

顯然,Python 的 print 包含傳統(tǒng)的 printf 特性以及簡(jiǎn)單的 echo 或 cout 的特性。

不過,這些示例包括的只是文字字符,盡管在某些情況下它們也很有用,但它們可能是 printf 最不重要的部分。printf 的真正的威力在于格式化說明。

使用 printf 格式化輸出

格式化說明符是以一個(gè)百分號(hào)(%)開頭的字符。

常見的格式化說明符包括:

%s: 字符串

%d: 數(shù)字

%f: 浮點(diǎn)數(shù)字

%o: 一個(gè)八進(jìn)制的數(shù)字

這些格式化說明符是 printf 語句的占位符,你可以使用一個(gè)在其它地方提供的值來替換你的 printf 語句中的占位符。這些值在哪里提供取決于你使用的語言和它的語法,這里有一個(gè)簡(jiǎn)單的 Java 例子:

string var=“hello\n”;

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

把這個(gè)代碼包裹在適當(dāng)?shù)臉影逦募?,在?zhí)行后,將呈現(xiàn):

$ 。/example

hello

$

但是,當(dāng)一個(gè)變量的內(nèi)容更改時(shí),有意思的地方就來了。假設(shè)你想基于不斷增加的數(shù)字來更新輸出:

#include 《stdio.h》

int main() {

int var=0;

while ( var 《 100) {

var++;

printf(“Processing is %d% finished.\n”, var);

}

return 0;

}

編譯并運(yùn)行:

Processing is 1% finished.

[。..]

Processing is 100% finished.

注意,在代碼中的兩個(gè) % 將被解析為一個(gè)打印出來的 % 符號(hào)。

使用 printf 限制小數(shù)位數(shù)

數(shù)字也可以是很復(fù)雜,printf 提供很多格式化選項(xiàng)。你可以對(duì)浮點(diǎn)數(shù)使用 %f 限制打印出多少個(gè)小數(shù)位。通過把一個(gè)點(diǎn)(。)和一個(gè)限制的數(shù)放置在百分符號(hào)和 f 之間, 你可以告訴 printf 打印多少位小數(shù)。這是一個(gè)簡(jiǎn)單的用 Bash 寫的簡(jiǎn)練示例:

$ printf “%.2f\n” 3.141519

3.14

$

類似的語法也適用于其它的語言。這里是一個(gè) C 語言的示例:

#include 《math.h》

#include 《stdio.h》

int main() {

fprintf(stdout, “%.2f\n”, 4 * atan(1.0));

return 0;

}

對(duì)于三位小數(shù),使用 .3f ,依次類推。

使用 printf 來在數(shù)字上添加逗號(hào)

因?yàn)槲粩?shù)大的數(shù)字很難解讀,所以通常使用一個(gè)逗號(hào)來斷開大的數(shù)字。你可以在百分號(hào)和 d 之間放置一個(gè)撇號(hào)(‘),讓 printf 根據(jù)需要添加逗號(hào):

$ printf “%’d\n” 1024

1,024

$ printf “%‘d\n” 1024601

1,024,601

$

使用 printf 來添加前綴零

printf 的另一個(gè)常用的用法是對(duì)文件名稱中的數(shù)字強(qiáng)制實(shí)行一種特定的格式。例如,如果你在一臺(tái)計(jì)算機(jī)上有 10 個(gè)按順序排列的文件,計(jì)算機(jī)可能會(huì)把 10.jpg 排在 1.jpg 之前,這可能不是你的本意。當(dāng)你以編程的方式寫一個(gè)到文件時(shí),你可以使用 printf 來用前綴為 0 的字符形成文件名稱。這是一個(gè)簡(jiǎn)單的用 Bash 寫的簡(jiǎn)練示例:

$ printf “%03d.jpg\n” {1..10}

001.jpg

002.jpg

[。..]

010.jpg

注意:每個(gè)數(shù)字最多使用 3 位數(shù)字。

使用 printf

正如這些 printf 示例所顯示,包括控制字符,尤其是 \n ,可能會(huì)冗長(zhǎng),并且語法相對(duì)復(fù)雜。這就是為什么開發(fā)像 echo 和 cout 之類的快捷方式的原因。不過,如果你時(shí)不時(shí)地使用 printf ,你就會(huì)習(xí)慣于這種語法,并且它也會(huì)變成你的習(xí)慣。我不認(rèn)為 printf 有任何理由成為你在日?;顒?dòng)中打印時(shí)的首選,但是它是一個(gè)很好的工具,當(dāng)你需要它時(shí),它不會(huì)拖累你。

花一些時(shí)間學(xué)習(xí)你所選擇語言中的 printf,并且當(dāng)你需要時(shí)就使用它。它是一個(gè)強(qiáng)有力的工具,你不會(huì)后悔隨時(shí)可用的工具。
責(zé)編AJX

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • UNIX
    +關(guān)注

    關(guān)注

    0

    文章

    296

    瀏覽量

    41497
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4332

    瀏覽量

    62666
  • Printf
    +關(guān)注

    關(guān)注

    0

    文章

    83

    瀏覽量

    13672
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    文教程:手把手教你焊接貼片元件,首先來張全部焊接個(gè)點(diǎn)的PCB圖
    發(fā)表于 04-01 11:03 ?3.6w次閱讀
    圖<b class='flag-5'>文教</b>程:手把手<b class='flag-5'>教你</b>焊接貼片元件

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

    不起眼的led到底還能走多久?
    發(fā)表于 11-05 21:40

    搞懂UPS主要內(nèi)容

    導(dǎo)讀:UPS是系統(tǒng)集成項(xiàng)目中常用到的設(shè)備,也是機(jī)房必備的設(shè)備。本文簡(jiǎn)單介紹了UPS的種類、功能、原理,品質(zhì)選擇與配置選擇方式,基礎(chǔ)維護(hù)等相關(guān)的內(nèi)容。搞懂UPS本文主要內(nèi)容:UPS種類、功能
    發(fā)表于 09-15 07:49

    篇小短文教你了解工字電感的各項(xiàng)參數(shù)

    篇小短文教你了解工字電感的各項(xiàng)參數(shù)篇小短文教你了解工字電感的各項(xiàng)參數(shù)工字電感是我們?cè)诓寮鳂I(yè)中會(huì)經(jīng)常看見且用到的電子元器件中的種;
    發(fā)表于 02-01 10:16

    printf函數(shù)用法示例

    《OpenCV3編程入門》書本配套源代碼:printf函數(shù)用法示例
    發(fā)表于 06-06 15:20 ?10次下載

    文教你怎么測(cè)量壓敏電阻的好壞

    本文主要介紹了文教你怎么測(cè)量壓敏電阻的好壞,“壓敏電阻“是種具有非線性伏安特性的電阻器件,主要用于在電路承受過壓時(shí)進(jìn)行電壓鉗位,吸收多余的電流以保護(hù)敏感器件。判斷壓敏電阻通常需要
    發(fā)表于 04-10 09:16 ?7.2w次閱讀

    實(shí)現(xiàn)重定向printf()和scanf() 函數(shù)案例分析

    要想printf()和scanf() 函數(shù)工作,我們需要把printf()和scanf() 重新定向到串口中。重定向是指用戶可以自己重寫C 的庫(kù)函數(shù),當(dāng)連接器檢查到用戶編寫了與C 庫(kù)
    發(fā)表于 06-23 08:26 ?9233次閱讀
    實(shí)現(xiàn)重定向<b class='flag-5'>printf</b>()和scanf() <b class='flag-5'>函數(shù)</b>案例分析

    不起眼的電阻里有哪些學(xué)問?

    電阻在我們的工作中比較常見,別小看這不起眼的電阻,里面有很多學(xué)問。 貼片電阻(SMD Resistor),又名片式固定電阻器,是種設(shè)計(jì)為貼片安裝的電阻器。 這些SMD電阻器通常比傳統(tǒng)的電阻器小得多
    的頭像 發(fā)表于 03-29 11:35 ?1470次閱讀
    <b class='flag-5'>不起眼</b>的電阻里有哪些學(xué)問?

    40篇英語短文教你精通3500個(gè)單詞

    40篇英語短文教你精通3500個(gè)單詞
    發(fā)表于 08-17 11:13 ?0次下載

    《51單片機(jī)筆記》keilC51軟件中printf函數(shù)內(nèi)部機(jī)制詳解,單片機(jī)中怎么使用printf函數(shù),printf函數(shù)編寫程序例子及

    printf函數(shù)的講解
    發(fā)表于 11-20 16:51 ?11次下載
    《51單片機(jī)筆記》keilC51軟件中<b class='flag-5'>printf</b><b class='flag-5'>函數(shù)</b>內(nèi)部機(jī)制詳解,單片機(jī)中怎么使用<b class='flag-5'>printf</b><b class='flag-5'>函數(shù)</b>,<b class='flag-5'>printf</b><b class='flag-5'>函數(shù)</b>編寫程序例子及

    STM32使用串口重定向系統(tǒng)printf函數(shù)輸出時(shí)出現(xiàn)初始化或使用printf函數(shù)系統(tǒng)卡死的原因及解決辦法

    STM32使用串口重定向系統(tǒng)printf函數(shù)輸出時(shí)出現(xiàn)初始化或使用printf函數(shù)系統(tǒng)卡死的原因及解決辦法在STM32開發(fā)當(dāng)中,會(huì)經(jīng)常使用
    發(fā)表于 12-09 10:06 ?13次下載
    STM32使用串口重定向系統(tǒng)<b class='flag-5'>printf</b><b class='flag-5'>函數(shù)</b>輸出時(shí)出現(xiàn)<b class='flag-5'>一</b>初始化或使用<b class='flag-5'>printf</b><b class='flag-5'>函數(shù)</b>系統(tǒng)卡死的原因及解決辦法

    通過串口利用printf函數(shù)輸出數(shù)據(jù)

    printf函數(shù)格式printf函數(shù)具有強(qiáng)大的輸出功能%表示格式化字符串輸出目前printf
    發(fā)表于 12-28 19:11 ?11次下載
    通過串口利用<b class='flag-5'>printf</b><b class='flag-5'>函數(shù)</b>輸出數(shù)據(jù)

    使用printf函數(shù)的安全隱患

    程序員都知道,也都會(huì)使用printf函數(shù),但你知道它也有“安全隱患”嗎?
    的頭像 發(fā)表于 10-09 09:49 ?1952次閱讀

    個(gè)簡(jiǎn)單而不起眼的2瓦迷你音頻放大器電路

    這是個(gè)簡(jiǎn)單而不起眼的2瓦迷你音頻放大器電路,適用于小型袖珍收音機(jī)和其他便攜式音頻小工具。該電路基于菲利普斯半導(dǎo)體IC TDA7052。該放大器甚至可以從 3V 水銀紐扣電池運(yùn)行。這使其成為電池供電小工具的理想選擇。
    的頭像 發(fā)表于 04-02 17:45 ?3494次閱讀
    <b class='flag-5'>一</b>個(gè)簡(jiǎn)單而<b class='flag-5'>不起眼</b>的2瓦迷你音頻放大器電路

    stdio.h實(shí)現(xiàn)了printf函數(shù)?

    我們平時(shí)包含的 stdio.h 頭文件,里面是不是實(shí)現(xiàn)了 printf 函數(shù)? 為什么會(huì)有這個(gè)疑問?因?yàn)槊看问褂?printf,就得包含 stdio.h ,這就導(dǎo)致很多同學(xué)誤以為,st
    的頭像 發(fā)表于 12-18 10:28 ?135次閱讀