日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言编程之格式化输出函数printf()说明

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言编程之格式化输出函数printf()说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

格式化字符串,是一些程序設計語言在格式化輸出API函數中用于指定輸出參數的格式與相對位置的字符串參數,例如C、C++等程序設計語言的printf類函數,其中的轉換說明用于把隨后對應的0個或多個函數參數轉換為相應的格式輸出;格式化字符串中轉換說明以外的其它字符原樣輸出。

格式化占位符(format placeholder),語法是:
%[parameter][flags][field width][.precision][length]type

?字符?? ?描述
n$?? ?n是用這個格式說明符(specifier)顯示第幾個參數;這使得參數可以輸出多次,使用多個格式說明符,以不同的順序輸出。 如果任意一個占位符使用了parameter,則其他所有占位符必須也使用parameter。這是POSIX擴展,不屬于ISO C。例:printf("%2$d %2$#x; %1$d %1$#x",16,17) 產生"17 0x11; 16 0x10"

Flags可為0個或多個:
字符?? ?描述
+?? ?總是表示有符號數值的'+'或'-'號,缺省情況是忽略正數的符號。僅適用于數值類型。
空格?? ?使得有符號數的輸出如果沒有正負號或者輸出0個字符,則前綴1個空格。如果空格與'+'同時出現,則空格說明符被忽略。
-?? ?左對齊。缺省情況是右對齊。
#?? ?對于'g'與'G',不刪除尾部0以表示精度。對于'f', 'F', 'e', 'E', 'g', 'G', 總是輸出小數點。對于'o', 'x', 'X', 在非0數值前分別輸出前綴0, 0x, and 0X表示數制。
0?? ?如果width選項前綴以0,則在左側用0填充直至達到寬度要求。例如printf("%2d", 3)輸出" 3",而printf("%02d", 3)輸出"03"。如果0與-均出現,則0被忽略,即左對齊依然用空格填充。?

Field Width給出顯示數值的最小寬度,典型用于制表輸出時填充固定寬度的表目。實際輸出字符的個數不足域寬,則根據左對齊或右對齊進行填充。實際輸出字符的個數超過域寬并不引起數值截斷,而是顯示全部。寬度值的前導0被解釋為0填充標志,如上述;前導的負值被解釋為其絕對值,負號解釋為左對齊標志。如果域寬值為*,則由對應的函數參數的值為當前域寬。

Precision通常指明輸出的最大長度,依賴于特定的格式化類型。對于d、i、u、x、o的整型數值,是指最小數字位數,不足的位要在左側補0,如果超過也不截斷,缺省值為1。對于a,A,e,E,f,F的浮點數值,是指小數點右邊顯示的數字位數,必要時四舍五入或補0;缺省值為6。對于g,G的浮點數值,是指有效數字的最大位數;缺省值為6。對于s的字符串類型,是指輸出的字節的上限,超出限制的其它字符將被截斷。如果域寬為*,則由對應的函數參數的值為當前域寬。如果僅給出了小數點,則域寬為0。

Length指出浮點型參數或整型參數的長度。此項Microsoft稱為“Size”。可以忽略,或者是下述:

字符?? ?描述
hh?? ?對于整數類型,printf期待一個從char提升的int尺寸的整型參數。
h?? ?對于整數類型,printf期待一個從short提升的int尺寸的整型參數。
l?? ?對于整數類型,printf期待一個long尺寸的整型參數。
對于浮點類型,printf期待一個double尺寸的整型參數。對于字符串s類型,printf期待一個wchar_t指針參數。對于字符c類型,printf期待一個wint_t型的參數。

ll?? ?對于整數類型,printf期待一個long long尺寸的整型參數。Microsoft也可以使用I64。
L?? ?對于浮點類型,printf期待一個long double尺寸的整型參數。
z?? ?對于整數類型,printf期待一個size_t尺寸的整型參數。
j?? ?對于整數類型,printf期待一個intmax_t尺寸的整型參數。
t?? ?對于整數類型,printf期待一個ptrdiff_t尺寸的整型參數。

?此外,在ISO C99廣泛接受前,還有幾個平臺相關的length選項:

字符?? ?描述
I?? ?對于有符號整數類型,printf期待一個ptrdiff_t尺寸的整型參數。對于無符號整數類型,printf期待一個size_t尺寸的整型參數。常見于Win32/Win64平臺。
I32?? ?對于整數類型,printf期待一個32位(雙字)的整型參數。常見于Win32/Win64平臺。
I64?? ?對于整數類型,printf期待一個64位(四字)的整型參數。常見于Win32/Win64平臺。
q?? ?對于整數類型,printf期待一個64位(四字)的整型參數。常見于BSD平臺。

ISO C99的頭文件inttypes.h包含了許多宏,用于平臺獨立的printf編碼。例如:?

宏?? ?定義
PRId32?? ?典型地等效于I32d (Win32/Win64)或d
PRId64?? ?典型地等效于I64d (Win32/Win64), lld (32位平臺)或ld (64位平臺)
PRIi32?? ?典型地等效于I32i (Win32/Win64)或i
PRIi64?? ?典型地等效于I64i (Win32/Win64), lli (32位平臺)或li (64位平臺)
PRIu32?? ?典型地等效于I32u (Win32/Win64)或u
PRIu64?? ?典型地等效于I64u (Win32/Win64), llu (32位平臺)或lu (64位平臺)
PRIx32?? ?典型地等效于I32x (Win32/Win64)或x
PRIx64?? ?典型地等效于I64x (Win32/Win64), llx (32位平臺)或lx (64位平臺)?

類型
Type,也稱轉換說明(conversion specification/specifier),可以是:

字符?? ?描述
d, i?? ?有符號十進制數值int。'%d'與'%i'對于輸出是同義;但對于scanf()輸入二者不同,其中%i在輸入值有前綴0x或0時,分別表示16進制或8進制的值。如果指定了精度,則輸出的數字不足時在左側補0。默認精度為1。精度為0且值為0,則輸出為空。
u?? ?十進制unsigned int。如果指定了精度,則輸出的數字不足時在左側補0。默認精度為1。精度為0且值為0,則輸出為空。
f, F?? ?double型輸出10進制定點表示。'f'與'F'差異是表示無窮與NaN時,'f'輸出'inf', 'infinity'與'nan';'F'輸出'INF', 'INFINITY'與'NAN'。小數點后的數字位數等于精度,最后一位數字四舍五入。精度默認為6。如果精度為0且沒有#標記,則不出現小數點。小數點左側至少一位數字。
e, E?? ?double值,輸出形式為10進制的([-]d.ddd e[+/-]ddd). E版本使用的指數符號為E(而不是e)。指數部分至少包含2位數字,如果值為0,則指數部分為00。Windows系統,指數部分至少為3位數字,例如1.5e002,也可用Microsoft版的運行時函數_set_output_format 修改。小數點前存在1位數字。小數點后的數字位數等于精度。精度默認為6。如果精度為0且沒有#標記,則不出現小數點。
g, G?? ?double型數值,精度定義為全部有效數字位數。當指數部分在閉區間 [-4,5] 內,輸出為定點形式;否則輸出為指數浮點形式。'g'使用小寫字母,'G'使用大寫字母。小數點右側的尾數0不被顯示;顯示小數點僅當輸出的小數部分不為0。
x, X?? ?16進制unsigned int。'x'使用小寫字母;'X'使用大寫字母。如果指定了精度,則輸出的數字不足時在左側補0。默認精度為1。精度為0且值為0,則輸出為空。
o?? ?8進制unsigned int。如果指定了精度,則輸出的數字不足時在左側補0。默認精度為1。精度為0且值為0,則輸出為空。
s?? ?如果沒有用l標志,輸出null結尾字符串直到精度規定的上限;如果沒有指定精度,則輸出所有字節。如果用了l標志,則對應函數參數指向wchar_t型的數組,輸出時把每個寬字符轉化為多字節字符,相當于調用wcrtomb函數。
c?? ?如果沒有用l標志,把int參數轉為unsigned char型輸出;如果用了l標志,把wint_t參數轉為包含兩個元素的wchart_t數組,其中第一個元素包含要輸出的字符,第二個元素為null寬字符。
p?? ?void *型
a, A?? ?double型的16進制表示,"[?]0xh.hhhh p±d"。其中指數部分為10進制表示的形式。例如:1025.010輸出為0x1.004000p+10。'a'使用小寫字母,'A'使用大寫字母。[2][3] (C++11流使用hexfloat輸出16進制浮點數)
n?? ?不輸出字符,但是把已經成功輸出的字符個數寫入對應的整型指針參數所指的變量。
%?? ?'%'字面值,不接受任何flags, width, precision or length。

寬度與精度格式化參數可以忽略,或者直接指定,或者用星號"*"表示取對應函數參數的值。例如printf("%*d", 5, 10)輸出"?? 10";printf("%.*s", 3, "abcdef") 輸出"abc"。

如果函數參數太少,不能匹配所有的格式參數說明符,或者函數參數的類型不匹配,將導致未定義(undefined)行為。過多的函數參數被忽略。許多時候,未定義的行為將導致格式化字符串攻擊。

某些編譯器,如GCC,會靜態檢查printf這一類函數的格式化參數并編譯警告存在的問題(當使用編譯標志-Wall或-Wformat)。GCC也會對用戶自定義的printf風格函數做靜態檢查,如果在函數定義時使用了非標準的 __attribute__((format(...)))。

來源:維基百科中文版

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的C语言编程之格式化输出函数printf()说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。