format string也是看過C Programming: A Modern Approach才注意的。寫文的當下沒帶這本書,問男人好了。
$ man 3 printf
簡單來說,format string是由
%
字元%s
之類的的東西整理conversion specifier如下
%
開頭Conversion specifier
結尾,就是我們看過的d
, f
等示意如下
%
[Flag][最少欄位寬度規範][精確度描述][<font color="green">變數size描述</font>]Conversion specifier
接下來依上面的部份說明如下
#
0x
, 0
等。0
0
作為pad。pad是啥呢?中文意思是填充物,自己體會吧。-
0
一起會不會數字多好幾倍如432
變4320000
?不會,兩個同時出現0
會被省略。+
' '
以上是C 語言規範的,不同編譯器有加碼,懶得寫,自己問男人吧。
一定要正整數,當印出的數字長度少於這邊指定的參數,會自動填空白或是0。印出超過這邊指定的寬度的話呢?超過就超過,不然要怎麼辦?
另外預設是往右邊對齊,想要往左對齊,請參考-
flag。
以.十進位數字表示
,不同的變數型態有不同的精確度定義。
舉例來說
一般來說,我們會知道d
是整數,但是在C語言還是有long int
,long long int
這樣型態的整數,為了能夠更精確的顯示,format string提供了這樣的描述,讓你加在Conversion specifier
,如
l
: longh
: short詳細列表和排列組合請問男人。
flag除了C規格定的以外,不同廠商有加料,一樣去問男人,不過要用這個的話要考慮porting的問題。
除此之外,男人有列出所有的Conversion specifier
,除了熟悉的d
, f
, s
, c
, x
以外,我列幾個我感興趣的如下
a
, A
: C99專用,實數的十六進位表示法p
: void * 的位址format string還有*
和%m$
這種鬼東西,目前搞不清楚為什麼要這樣幹。 不過幾然花了時間搞懂,就整理一下
*
指目前對應的參數的下一個參數%m$*n$
把第n個的參數和第m個顯示交換不知道是什麼鬼對不對?我也是,所以寫了程式測試一下
#include <stdio.h>
int main(int argc, char **argv)
{
int i = 2;
int j = 3;
int k = 4;
printf("@@%*d\n", i, j);
/* print third argument then first argument */
printf("!!%3$*1$d, %1$*2$d\n", i, j, k);
return 0;
}
看看輸出吧,一樣懶得寫Makefile
$ make test_format_string
cc test_format_string.c -o test_format_string
$ ./test_format_string
@@ 3
!! 4, 2
這篇文章文章我介紹了