一、輸出格式
??在C語言中,printf 函數提供了多種輸出格式,用于控制不同類型數據的輸出方式。
1.整數輸出格式
%d:以十進制形式輸出整數。
%o:以八進制形式輸出整數(無前導0)。
%x 或 %X:以十六進制形式輸出整數(小寫x表示小寫字母,大寫X表示大寫字母)。
%u:以無符號十進制形式輸出整數。
字段寬度和精度:可以在%和格式字符之間插入一個數字來指定字段寬度(即輸出的最小寬度)(默認右對齊)如果數值的位數小于指定的字段寬度,那么輸出將在左側用空格填充。(除非使用了負號-,表示左對齊,這時將在右側填充空格)。
2.浮點數輸出格式
%f:以標準的小數形式輸出浮點數。
%e 或 %E:以科學計數法形式輸出浮點數(小寫e表示小寫字母,大寫E表示大寫字母)。
%g 或 %G:自動選擇%f或%e格式中較短的一種輸出,且不輸出無意義的零。
字段寬度和精度:可以通過 %m.nf 的形式來指定輸出的字段寬度 m 和小數點后的位數 n。如果省略 m,則寬度由系統決定;如果省略 n,則默認為6位小數。
3.字符輸出格式
%c:輸出一個字符。
字段寬度:可以使用 %mc 的形式來指定輸出的字符寬度。如果字符的ASCII碼值對應的字符寬度小于指定的寬度,則會在左側或右側(取決于是否使用-)填充空格以達到指定的寬度。
4.字符串輸出格式
%s:輸出一個字符串。
字段寬度和精度:可以通過 %ms、%-ms、%m.ns、%-m.ns 的形式來指定輸出的字符串寬度和精度。m指定字段寬度,n指定從字符串左側開始輸出的字符數。如果省略n,則輸出整個字符串。
5.其他
%n:將已打印字符數保存在整型指針所指向的變量中。這通常用于統計printf函數的輸出字符數。
轉義字符:如 \n(換行)、\t(制表符) 等,用于在輸出中插入特殊字符。
6.修飾符
l 或 L:用于輸出長整型(long)或長雙精度浮點數(long double)。例如,%ld用于輸出long型整數,%Lf:用于輸出long double型浮點數。
h:用于輸出短整型(short)。例如,%hd用于輸出short型整數。
7.標志
-:左對齊輸出。
+:對于整數,總是輸出符號(正號或負號)。
空格:對于整數,如果為正數,則在其前面加一個空格;如果為負數,則輸出負號。
#:對于o(八進制)和x(十六進制)格式,總是在輸出的數前面加上0或0x/0X前綴。
這些輸出格式和修飾符可以組合使用,以控制 printf 函數的輸出格式。
二、占位輸出
在C語言中,使用printf函數時,可以通過格式說明符來指定輸出的位數。對于整數,可以使用字段寬度和精度說明符來控制輸出的格式。雖然精度通常用于浮點數,但字段寬度對于整數和浮點數都是有用的。對于整數,可以使用%d、%x或%o等來說明符,并在它們前面添加一個數字來指定字段的最小寬度。如果數值的位數小于指定的字段寬度,那么輸出將在左側用空格填充(除非使用了負號-,表示左對齊,這時將在右側填充空格)。
整型:
%2d:如果數值的位數小于指定的字段寬度,那么輸出將在左側用空格填充
%02d:如果數值的位數小于指定的字段寬度,那么輸出將在左側用0填充
指定字段寬度(右對齊)
#include <stdio.h> int main(void)
{ int num = 255; printf("Decimal: %5d\n", num); // 輸出:Decimal: 255(前面有2個空格) printf("Hexadecimal: %8x\n", num); // 輸出:Hexadecimal: ff(前面有6個空格) printf("Decimal: %05d\n", num); // 輸出:Decimal: 255(前面有2個0) printf("Hexadecimal: %08x\n", num); // 輸出:Hexadecimal: ff(前面有6個0) return 0;
}
指定字段寬度并左對齊
#include <stdio.h> int main(void)
{ int num = 255; printf("1:右對齊,不足左側補0\n"); printf("Decimal:\n%05d\n", num); // 輸出:Decimal: 255(前面有2個0) printf("Hexadecimal:\n%08x\n", num); // 輸出:Hexadecimal: ff(前面有6個0)printf("2:右對齊,不足左側補空格\n"); printf("Decimal:\n%5d\n", num); // 輸出:Decimal: 255(前面有2個空格) printf("Hexadecimal:\n%8x\n", num); // 輸出:Hexadecimal: ff(前面有6個空格)printf("3:左對齊,不足右側補空格\n");printf("Decimal:\n%-5d\n", num); // 輸出:Decimal: 255 (后面有2個空格) printf("Hexadecimal:\n%-8x\n", num); // 輸出:Hexadecimal: ff (后面有6個空格) return 0;
}
對于浮點數,可以同時指定字段寬度和精度
精度用于指定小數點后的位數,而字段寬度用于指定整個數字(包括小數點和符號)的最小寬度。
#include <stdio.h> int main(void)
{ float pi = 3.14159265; printf("Pi:%7.2f\n", pi); // 輸出:Pi:0003.14(整個數字寬度為7,小數點后有2位)右對齊printf("Pi:%07.2f\n", pi); // 輸出:Pi: 3.14(整個數字寬度為7,小數點后有2位)右對齊printf("Pi:%-7.2f\n", pi); // 輸出:Pi:3.14 (整個數字寬度為7,小數點后有2位)左對齊return 0;
}
使用 * 作為字段寬度或精度的占位符
使用 * 作為字段寬度或精度的占位符,并在 printf 的參數列表中提供一個整數來指定實際的寬度或精度。允許在運行時動態地設置這些值。
#include <stdio.h> int main(void)
{ int num = 255; int width = 8; printf("Decimal:%0*d\n", width, num); // 輸出:Decimal: 255(前面有5個0)printf("Decimal:%*d\n", width, num); // 輸出:Decimal: 255(前面有5個空格)printf("Hexadecimal:%0*x\n", width, num); // 輸出:Hexadecimal: ff(前面有6個0) printf("Hexadecimal:%*x\n", width, num); // 輸出:Hexadecimal: ff(前面有6個空格) printf("Decimal:%-*d\n", width, num); // 輸出:Decimal: 255(后面5個空格)printf("Hexadecimal:%-*x\n", width, num); // 輸出:Hexadecimal: ff(后面有6個空格) return 0;
}
//在這個例子中,%*x 中的 * 表示字段寬度將從參數列表中獲取,即width變量的值。
其它,分配一個足夠大的字符串并打印字符串格式內容
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>char *make_message(const char *fmt, ...)
{int size = 0;char *p = NULL;va_list ap;/* Determine required size */va_start(ap, fmt);size = vsnprintf(p, size, fmt, ap);va_end(ap);if (size < 0)return NULL;size++; /* For '\0' */p = malloc(size);if (p == NULL)return NULL;va_start(ap, fmt);size = vsnprintf(p, size, fmt, ap);va_end(ap);if (size < 0) {free(p);return NULL;}return p;
}int main(int argc,char *argv[])
{ char *p=make_message(argv[1]);if(p !=NULL){printf("%d\n%*s\n",(int)strlen(p),(int)strlen(p),p);}return 0;
}