自定義格式化輸出函式

2021-09-19 22:59:33 字數 2313 閱讀 6920

1.寫在前面

在嵌入式開發過程中,經常需用到格式化列印函式進行列印、除錯原始碼,即c庫中的「printf」函式。printf可以重定向到串列埠(uart)、usb輸出,從而輸出至除錯終端列印,如串列埠助手、scure crt等。對於大部分常見應用情況,只要重定向printf輸出函式即可,而特殊情況下,可能需自定義實現格式化函式;比如為節約資源使用,沒有使用到全部printf功能,此時只需實現部分所需要的格式化功能。

2.標準格式化輸出

c庫標準格式化函式是「printf」,可以輸出到顯示終端、檔案、重定向到處理埠等,可以自定義字元、數字、進製、長度輸出。

常用輸出格式有:

控制字涵義

%d以十進位制有符號整型數輸出

%ld以十進位制有符號長整型數輸出

%nd指定輸出欄位的寬度(n),如果資料的位數小於 n,則左端補以空格;否則按實際位數輸出

%u以無符號整型輸出

%f以浮點數輸出

%.nf

以浮點數輸出,小數點後保留n位,注意 n 前面有個點

%o以八進位制整型數輸出

%x以十六進製制整型數輸出,小寫字母表示

%x以十六進製制整型數輸出,大寫字母表示

%c字元輸出

%s字串輸出

3.自定義格式化輸出

3.1 c語言函式可變形參

由於使用到了可變形參問題,c庫提供了一組解決該問題的「巨集」——va_list,該巨集位於「stdarg.h」標頭檔案 中,因此使用時需先包函該標頭檔案。va_list巨集有幾個關鍵的巨集呼叫。巨集涵義

va_start

獲取可變引數列表的第乙個引數的位址

va_arg

獲取可變引數的當前引數,返回指定型別並將指標指向下一引數

va_end

清空可變引數列表

va_list巨集使用比較簡單,基本步驟可以歸納為幾點。

函式裡定義va_list型的指標變數,指向函式形參;

呼叫va_start初始化va_list變數;

依次呼叫va_arg返回可變的引數,va_arg的第二個引數為待獲取引數的型別;

呼叫完畢需呼叫va_end清空va_list。

3.2 格式函式

標準格式化函式功能強大,而一般情況下,常用的格式基本是字元、字串、整型、十六進製制等,因此自定義暫時實現常規的格式。

/**

* @brief 格式化輸出,暫時支援 %c、%d、%s、%u、%x 、%x

* @param put:重定向輸出(如uart)

* @retval none

*/void uart_debug_printf(int (*put)(char data),char *str, ...)

if(*str == '%')

if(*str == 'd')

}temp = va_temp;

while(temp)

temp = va_temp;

while(base_value)

break;

case 'x':

case 'x':

va_temp = va_arg(va_print, uint32_t);

base_value = 8;

ch1 = 0;

while(base_value--)

if(ch!=0)

if(ch <= 9)

else

}break;

case 'c':

va_temp = va_arg(va_print, uint32_t);

(*put)(va_temp);

break;

case 's':

pstr = (char *)va_arg(va_print, char *);

for(; *pstr != '\0'; pstr++)

break;

case '%':

(*put)(*str);

break;

default:

break;

}str++;}}

va_end(va_print);

}

另外對於十進位制數整型的輸出,也可以考慮遞迴函式,會比較容易理解,但會占用一定棧空間。

void printf_dec(int(*put)(char data), int value)

else

}

js 自定義format格式化輸出

在使用js的時候,經常要進行字串的拼接,一但使用 號進行字串拼接的時候,基本是各種問題,又不好維護,有沒有更好的方法地其進行格式化輸出呢?答案肯定是有的,如果你使用nodejs,它已經自帶的,如果你還在使用純原生js,那不好意思了。為string物件新增format方法 string.prototy...

jqGrid 自定義格式化

jquery grid id jqgrid function currencyfmatter cellvalue,options,rowobject do something here return new format value cellvalue 要被格式化的值 options 對資料進行格式...

JSP自定義標籤 日期格式化

在直接進行格式化.如 就是將屬性date按yyyy mm dd的格式進行輸出.2.利用進行格式化.如 或者 3.還有一種是通過國際化的方式來進行 首先在struts.properties中配置struts.custom.i18n.resources globalmessages 然後在globalm...