首頁>技術>

摘要

#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);}

效果:

9
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • linux核心vmalloc原理與實現