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

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

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

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

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

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

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

printf 簡史

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

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

$ echo hello

hello

$

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

$ printf “%s\n” hello

hello

$

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

printf 輸出

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

\n: 新行

\r: 回車換行

\t: 水平制表符

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

例如:

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

SETH

$

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

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

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

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

$

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

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

S

》》》

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

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

使用 printf 格式化輸出

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

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

%s: 字符串

%d: 數(shù)字

%f: 浮點數(shù)字

%o: 一個八進制的數(shù)字

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

string var=“hello\n”;

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

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

$ 。/example

hello

$

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

#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 限制小數(shù)位數(shù)

數(shù)字也可以是很復雜,printf 提供很多格式化選項。你可以對浮點數(shù)使用 %f 限制打印出多少個小數(shù)位。通過把一個點(。)和一個限制的數(shù)放置在百分符號和 f 之間, 你可以告訴 printf 打印多少位小數(shù)。這是一個簡單的用 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;

}

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

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

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

$ printf “%’d\n” 1024

1,024

$ printf “%‘d\n” 1024601

1,024,601

$

使用 printf 來添加前綴零

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

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

001.jpg

002.jpg

[。..]

010.jpg

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

使用 printf

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

花一些時間學習你所選擇語言中的 printf,并且當你需要時就使用它。它是一個強有力的工具,你不會后悔隨時可用的工具。
責編AJX

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

    關(guān)注

    0

    文章

    296

    瀏覽量

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

    關(guān)注

    3

    文章

    4286

    瀏覽量

    62337
  • Printf
    +關(guān)注

    關(guān)注

    0

    文章

    81

    瀏覽量

    13611
收藏 人收藏

    評論

    相關(guā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)容

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

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

    篇小短文教你了解工字電感的各項參數(shù)篇小短文教你了解工字電感的各項參數(shù)工字電感是我們在插件作業(yè)中會經(jīng)常看見且用到的電子元器件中的種;
    發(fā)表于 02-01 10:16

    printf函數(shù)用法示例

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

    文教你怎么測量壓敏電阻的好壞

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

    基于STM32的printf串口數(shù)據(jù)輸出

    ()這個函數(shù)實現(xiàn)的,所以我們通過重映射的方式,修改這個函數(shù)的定義使它輸出在STM32的寄存器中,便可以實現(xiàn)使用printf()
    發(fā)表于 06-21 07:51 ?2w次閱讀
    基于STM32的<b class='flag-5'>printf</b>串口數(shù)據(jù)輸出

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

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

    不起眼的電阻里有哪些學問?

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

    40篇英語短文教你精通3500個單詞

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

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

    printf函數(shù)的講解
    發(fā)表于 11-20 16:51 ?11次下載
    《51單片機筆記》keilC51軟件中<b class='flag-5'>printf</b><b class='flag-5'>函數(shù)</b>內(nèi)部機制詳解,單片機中怎么使用<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ù)輸出時出現(xiàn)初始化或使用printf函數(shù)系統(tǒng)卡死的原因及解決辦法

    STM32使用串口重定向系統(tǒng)printf函數(shù)輸出時出現(xiàn)初始化或使用printf函數(shù)系統(tǒng)卡死的原因及解決辦法在STM32開發(fā)當中,會經(jīng)常使用
    發(fā)表于 12-09 10:06 ?13次下載
    STM32使用串口重定向系統(tǒng)<b class='flag-5'>printf</b><b class='flag-5'>函數(shù)</b>輸出時出現(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ù)具有強大的輸出功能%表示格式化字符串輸出目前printf
    發(fā)表于 12-28 19:11 ?11次下載
    通過串口利用<b class='flag-5'>printf</b><b class='flag-5'>函數(shù)</b>輸出數(shù)據(jù)

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

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

    個簡單而不起眼的2瓦迷你音頻放大器電路

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