//只節選部分代碼說明
char txt[32];
unsigned int Distance=0;
while(1)
{
if(timecount>=50) //500ms采集一次距離
{
if(CheckChanel[0]==1)
{
Distance = Read_Distance();
if(Distance<1000)
{
Gui_DrawFont_GBK16(100,25,BLUE,GRAY0," ");
}
sprintf(txt, "%d", Distance);
Gui_DrawFont_GBK16(85,25,BLUE,GRAY0,txt); //前兩個引數是坐標,顯示內容顏色,背景色,資料
}
timecount=0;
LED1=~LED1;
}
}
}
????最近專案用到了sprintf函式除錯程式,故想寫下一篇博客來分析下sprintf函式,其函式原型為:
function prototype
int sprintf(char *buffer ,const char *format, [argument]…);
????看到const和指標的宣告,我想簡單提下幾種宣告的區別,在經典書《C專家編程》有對恐怖的C語言宣告做過解釋
/*第1,2種情況,指標所指向的物件是只讀的
當然物件和指標有可能都是只讀的*/
const char *format;
char const *format;
char * const format; //第3種情況指標是只讀的
/*下面兩種方式的宣告都能做到這一點--->物件和指標都是只讀的*/
const char * const format;
char const * const format;
小技巧------>Keil5中滑鼠放在呼叫函式名處不動,即可顯示出該函式的函式原型
玩透sprintf和printf函式
-
sprintf是一個變參函式,和printf的功能差不多,只是第一個引數是指定把輸出的內容輸出到“什么地方”
-
//網友的例子 例:將”test 1 2”寫入陣列s中 #include<stdio.h> int main(int argc, char *avgv[]) { char s[40]; /*第一個引數就是指向要寫入的那個字串的指標,剩下的就和printf()一樣了*/ sprintf(s,"%s%d%c","test",1,'2'); /*你可以比較一下,這是向螢屏輸入*/ printf("%s%d%c","test",1,'2'); return 0; }
????網上找的例子是在標準C語言在PC端除錯,最常用的printf列印函式,會直接列印到PC端命令列視窗上,而在單片機除錯中,我們常用printf列印有用資訊來除錯我們的程式,但是卻不能直接使用,究其原因,在于標準C語言printf函式的底層實作的機制,已經規定輸出流輸出到PC端的顯示幕(或者是現編譯器的命令列視窗),
????這也是單片機除錯時,為什么要對printf函式進行重定向的原因,所謂重定向,這里涉及流的概念,即“重新定義資訊流的流動方向‘’——我從哪里來,又要到哪里去”,即要實作在串口或者LCD上顯示,必須重定義標準庫函式里面呼叫的輸出設備定義的相關函式,
????擴展一下:在C++中,包含了標準庫#include ,其中stream英文表示流的意思,iostream庫是istream(輸入流)和ostream(輸出流)組合而成,術語流極其想表達出字符隨著時間順序生成和消失的特點,
#include<iostream>
int main(){
std::cout<<"hello,world";
return 0;
}
????接下來,我們又回到sprintf函式,sprintf在引數串列中多了一個“具體輸出到什么地方”的引數,與printf函式不同在于轉化后的結果沒有送往標準輸出設備,而是存放在由指標變數buffer指定的字符緩沖區,這個緩沖區可以是個字符陣列,
????例如,將浮點數3.14轉化成長度為4,含2位小數的字串,存盤在字符緩沖區buffer中,代碼如下:
sprintf(buffer,"%4.2f",3.14)
專案中sprintf的用法
#include "stdio.h" //為了解除sprintf警告
unsigned int Distance=0;
char txt[32];
/*這個Distance在上文環境中被定義為距離變數,
測距傳感器采集的距離值存盤在此變數內,*/
sprintf(txt, "%d", Distance);
//將Distance變數內容按照%d格式放在txt陣列中,來方便顯示
匯總sprintf三大常犯錯誤:
1.給定的緩沖區溢位,如給的陣列的長度太短而導致溢位,
2.和printf搞混,忘記第一個引數,
3.對應的格式化字串用錯,引數可以有很多個,
char s[40];
sprintf(s,"%s%d%c","test",1,'2');
/*這里將內容("test",1,'2')按照指定的格式("%s%d%c")輸出
到這個地方(s)*/
????sprintf函式功能強大,可以方便的完成各類資料型別的轉換,但會占用相當大的代碼空間,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394187.html
標籤:其他
