printf函数的格式修饰符
本文介紹printf函數的一些特殊的格式控制修飾符
1、域寬修飾符 –> 數字
對所有格式控制符都有效,即便是%%也不例外
寬度修飾符出現在%和格式控制符之間的數字,使數據在固定區域打印。如果待打印的數值不能填滿位置,它的左側會被天上空格以滿足填滿域寬區域,這些數值是右對齊的;如果超過了給定域寬,輸出區域會調整域寬以恰好能容納該數值,而不會把該數值截斷。
2、精度修飾符 -> ”. + 數字“
①對于整數格式項%d、%o、%x和%u,精度修飾符指定了它們打印數字的最少位數,要是待打印的數值小于指定位數,那么打印該數值時會在它的前面補0,以湊足指定的位數;要是到打印的數值大于指定位數,那么指定無效,打印該數值的全部位數。
②對于%e、%E和%f格式控制符,精度修飾符指定了小數點后應該出現的數字位數,只有當精度大于0時,才會出現小數點。
#include <stdio.h> #include <math.h>int main() {double pi = 4 * atan(1.0);printf("%.0f %.1f %.3f %.10f\n", pi, pi, pi, pi);printf("%.0e %.1e %.3e %.10e\n", pi, pi, pi, pi);printf("%.0E %.1E %.3E %.10E\n", pi, pi, pi, pi);system("pause"); return 0; }③對于%g和%G格式控制符來說,驚呆修飾符指定了打印數據中有效數字的位數,如果小數點之后沒有數字,那么小數點也不會被打印。
#include <stdio.h>int main() {printf("%.1g %.1g %.2g %.3g %.8g\n", 1 / 3.0, 10/3.0, 10 / 3.0, 10 / 3.0, 10 / 3.0);printf("%.1G %.1G %.2G %.3G %.8G\n", 1 / 3.0, 10/3.0, 10 / 3.0, 10 / 3.0, 10 / 3.0);system("pause");return 0; }④用于%s格式控制符,指定要從相應的字符串中打印的字符個數。當指定的值小于字符串中字符個數時,只輸出字符串中的前N個字符(N為精度值),當指定的大于字符串中字符個數時,輸出的字符個數為字符串中全部字符的個數。
#include <stdio.h>int main() {int ret1 = 0;int ret2 = 0;int ret3 = 0;ret1 = printf("%.10s\n", "abcdefg");ret2 = printf("%.5s\n", "abcde");ret3 = printf("%.3s\n", "abcdefg");printf("%d %d %d\n", ret1, ret2, ret3); system("pause");return 0; }3、標志符
①-
此標識符后必須跟有域寬才會有意義,它的作用是使指定了域寬的數據輸出時左對齊。
②+
規定每個待打印的數值在輸出時都應以它的符號(“+”、“-”)作為第一個字符。
③空白字符(空格)
如果數值是非負數,就在它的前面添加一個空格。
PS:要是空白字符修飾符與+修飾符出現在一起,以+修飾符為準。
④#
%o格式控制符在打印輸出時在數字的前面加一個0,%x或%X在打印輸出時在數字的最前面加一個0x或0X。
對浮點數格式來說,#標志符要求小數必須被打印出來,即使小數點之后沒有數字,對于%g和%G來說,不會去掉數值尾綴的0.
#include <stdio.h> #include <math.h>int main() {printf("%.0f %#.0f %g %#g\n", 3.0, 3.0, 3.0, 3.0);system("pause");return 0; }4、%n
%n與其他格式說明符號不同。不向printf傳遞格式化信息,而是用于指出函數已經打印的字符的個數,這個數被存儲在對應參數(整型指針)所指向的整數中。
這兒的&n就是我們存儲字符個數的整型指針。
PS:是不是趕腳有些像用scanf()給n輸入一個值
5、使用 * 替換域寬或精度值
有時候,因為數據的不同,我們可能想使用的域寬或精度值也不同,例如,字符數組里面每次存儲的字符個數可能是不同的,那么我們想要不管每次給的字符數是多少,都不用改變printf()函數格式控制字符串里的域寬和精度值該怎么做呢。
因為數值的長度在程序中是寫“死”的數字(magic number),那么可能我們經常會這樣來定義數組
那么為了方便每次打印str里面存儲的字符時不用修改printf()函數格式控制字符串里的域寬和精度值,我們可能會這樣寫:
printf("%MAXSIZE.MAXSIZEs", str);但是,預處理器的范圍不能作用到字符串的內部,所以這樣是不可能達到我們的期望的。
而通過一個格式修飾符 * 我們可以很巧妙的做到這一點:
這兒用 * 替換域寬和精度值,使printf()的參數列表里依次出現代表域寬的參數和代表精度值的參數,巧妙的避免的預處理器不能作用于字符串內部的問題。
總結
以上是生活随笔為你收集整理的printf函数的格式修饰符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ruby mysql dbi_Ruby
- 下一篇: Oracle 11g ora 15018