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
這篇文章文章我介紹了