摘要
#include <stdio.h>int printf ( const char *fmtstr /* format string */ <[>, arguments ... <]>); /* additional arguments */
描述
printf函式格式化一系列字串和數值,並使用putchar函式構建一個字串以寫入輸出流。fmtstr引數是一個格式字串,可以由字元、轉義序列和格式規範組成。
普通字元和轉義序列按其解釋順序複製到流中。格式規範總是以百分號(“%”)開頭,並要求printf函式呼叫中包含其他引數。
格式字串從左到右讀取。遇到的第一個格式規範引用fmtstr之後的第一個引數,並使用格式規範將其轉換和輸出。第二個格式規範訪問fmtstr之後的第二個引數,依此類推。如果引數多於格式規範,則會忽略額外的引數。如果沒有足夠的引數用於格式規範,或者引數型別與fmtstr指定的型別不匹配,則結果是不可預測的。
格式規範有以下通用格式:% <[>flags<]> <[>width<]> <[>.precision<]> <[>{b|B|l|L}<]> type
格式規範中的每個欄位可以是指定特定格式選項的單個字元或數字。
type欄位是一個字元,用於指定引數是被解釋為字元、字串、數字還是指標,如下表所示。
注:
可選字元l或l可以緊跟在型別字元之前,分別指定d、i、u、o、x和x的長型別。
可選字元b或b可以緊跟在型別字元之前,以分別指定d、i、u、o、x和x的字元型別。
跟在百分號後面的字元如果不能被識別為格式規範,則被視為普通字元。例如,“%%”將單個百分號寫入輸出流。
flags欄位是一個字元,用於對齊輸出,列印+/-符號和空格、小數點、八進位制和十六進位制字首,如下表所示。
width 欄位是一個非負數,指定列印的最小字元數。如果輸出值中的字元數小於寬度,則在左側(預設情況下)或右側(指定-標誌時)新增空格以填充到最小寬度。如果寬度字首為“0”,則填充零而不是空格。寬度欄位從不截斷輸出。如果輸出值的長度超過指定的寬度,則輸出所有字元。
width 欄位可以是星號(“*”),在這種情況下,引數列表中的int引數提供寬度值。在星號前面指定一個“b”表示引數是無符號字元。
精度欄位是一個非負數,指定要列印的字元數、有效位數或小數位數。對於下表中指定的浮點數,精度欄位可能導致輸出值的截斷或舍入。
precision 欄位可以是星號(“*”),在這種情況下,引數列表中的int引數提供值。在星號前面指定一個“b”表示引數是無符號字元。
注
必須確保引數型別與格式規範的型別匹配。您可以使用型別轉換來確保將正確的型別傳遞給printf。
此函式是特定於實現的,基於__getkey和putchar函式的操作。標準庫中提供的這些函式使用微控制器的串列埠讀寫字元。自定義函式可能使用其他I/O裝置。
由於8051施加的記憶體限制,可傳遞給該函式的位元組總數受到限制。在小型或緊湊型中最多可以傳遞15個位元組。在大型模型中最多可以傳遞40個位元組。
返回值printf函式返回實際寫入輸出流的字元數。
參考文獻:Cx51 User's Guide (KEIL C51官方參考手冊)
影片講解及測試例子:影片講解:
程式:
/* 1,串列埠的初始化(設定波特率,設定串列埠的工作方式,奇偶校驗:96N81) 9600 8 N 1 (不能產生115200) 2,有必要就設定串列埠中斷:開啟串列埠中斷和總中斷 3,可以printf函式(需要包含標頭檔案stdio.h) 3,自己編寫傳送和接收字元和字串的函式 4,傳送和接收完後,需要軟體清除串列埠中斷標誌位(RI,TI) TI=0*/#include<reg51.h>#include<stdio.h>//毫秒延時函式void delay_ms(unsigned int t){ unsigned int a = 0,b = 0; for(b=0;b<t;b++) for(a=110;a>0;a--);}void Uart_Init(void){ TMOD |= 0X20;// 使用定時器1 工作方式2 TH1=TL1=0XFD; //設定波特率9600 //時鐘頻率11.0592M SCON = 0X50; //串列埠工作在方式1 REN=1 接收資料 PCON = 0; //SMOD=1:波特率加倍 這裡是不加倍 ES=1; //開啟串列埠中斷 EA=1; //開啟總中斷 TR1=1; //開啟定時器1}int main(void){ void tst_printf (void); char a='A'; Uart_Init(); TI = 1; //RI while(1) { printf("doubixiaohanhan %c\n",a++); //tst_printf(); delay_ms(500); } return 0; }void tst_printf (void) { char a = 1; int b = 12365; long c = 0x7FFFFFFF; unsigned char x = 'A'; unsigned int y = 54321; unsigned long z = 0x4A6F6E00; float f = 10.0; float g = 22.95; char buf [] = "Test String"; char *p = buf; printf ("char %bd int %d long %ld\n",a,b,c); printf ("char %c int %d long %ld\n",a,b,c); printf ("Uchar %bu Uint %u Ulong %lu\n",x,y,z); printf ("xchar %bx xint %x xlong %lx\n",x,y,z); printf ("String %s is at address %p\n",buf,p); printf ("%f != %g\n", f, g); printf ("%*f != %*g\n", (int)8, f, (int)8, g);}
效果: