C語(yǔ)言利用sprintf固定字符串輸出位數(shù)
一、前言
sprintf
函數(shù)是一個(gè) C 語(yǔ)言中的函數(shù),也被許多其他編程語(yǔ)言所支持。它允許你根據(jù)一組變量來(lái)格式化和存儲(chǔ)一個(gè)字符字符串。sprintf
函數(shù)可以用于將格式化的數(shù)據(jù)寫入字符數(shù)組或字符串中,然后根據(jù)需要打印或存儲(chǔ)該字符串。sprintf
函數(shù)的第一個(gè)參數(shù)是格式化數(shù)據(jù)將被寫入的字符數(shù)組或字符串,隨后的參數(shù)是用于生成格式化輸出的變量。sprintf
函數(shù)允許你控制輸出的格式,包括小數(shù)點(diǎn)后的位數(shù)、字段的寬度和文本的對(duì)齊方式等。
在單片機(jī)項(xiàng)目開發(fā)中經(jīng)常需要通過(guò)sprintf組合字符串,完成各種數(shù)據(jù)的打印,顯示等等。
比如:
在單片機(jī)里通過(guò)LCD屏顯示傳感器數(shù)據(jù)的時(shí)候,如果不固定字符串長(zhǎng)度,每次從傳感器讀取的數(shù)據(jù)長(zhǎng)度可能都不一樣,一般都會(huì)先清屏再顯示,或者先使用空格清除顯示,再顯示實(shí)際數(shù)據(jù)。這種在LCD刷新頻率比較低的情況下肉眼會(huì)看出屏幕閃爍的效果。 為了方便顯示,我們可以使用sprintf固定最終數(shù)據(jù)的長(zhǎng)度,預(yù)置好傳感器最大輸出的長(zhǎng)度進(jìn)行顯示,后期采集的數(shù)據(jù)如果不夠長(zhǎng)度,就以空格補(bǔ)齊。這樣調(diào)用顯示函數(shù)就很方便了,不需要擔(dān)心清屏問(wèn)題。
二、案例
【1】多個(gè)整數(shù)輸出補(bǔ)齊
我們讀取到DS18B20溫度,需要顯示在LCD顯示屏上。我們將得到的溫度固定長(zhǎng)度為5個(gè)字符的字符串,顯示到LCD屏上。
char DS18B20_str[10]; DS18B20=readDs18b20(); sprintf(DS18B20_str, "%02d.%01d", DS18B20 >> 4, DS18B20 & 0xF);
這里,我們使用了%02d和%01d格式化字符串來(lái)指定輸出數(shù)字的位數(shù)。%02d表示要輸出兩位數(shù)字,并在前面補(bǔ)零(如果需要),而%01d表示要輸出一位數(shù)字。因此,上面的代碼將會(huì)打印出一個(gè)形如"12.3 "(注意最后的空格)的字符串,其中數(shù)字部分總共有5個(gè)字符(包括小數(shù)點(diǎn))。
【2】單個(gè)整數(shù)輸出補(bǔ)齊
char mqtt_message[10]; water_hp=read_water_hp(); sprintf(mqtt_message, "%3d", water_hp);
這將把 water_hp
轉(zhuǎn)換為一個(gè) 3 位寬的字符串,并根據(jù)需要在左邊用空格填充。如果 water_hp
不足 3 位,它將被左側(cè)填充空格以達(dá)到 3 位的寬度。
【3】固定時(shí)間長(zhǎng)度
下面是一個(gè)將秒轉(zhuǎn)為時(shí)分秒輸出的C語(yǔ)言函數(shù):
#include <stdio.h> #include <string.h> ? char* formatTime(int seconds) { static char timeStr[9]; // 時(shí)分秒格式化后最多占用8個(gè)字符,再加上'\0'結(jié)束符 int hours, minutes; hours = seconds / 3600; seconds = seconds % 3600; minutes = seconds / 60; seconds = seconds % 60; snprintf(timeStr, sizeof(timeStr), "%02d:%02d:%02d", hours, minutes, seconds); return timeStr; } ? int main() { int seconds = 3661; // Example value char* timeStr = formatTime(seconds); printf("%s\n", timeStr); return 0; }
這個(gè)程序中,formatTime
是我們創(chuàng)建的子函數(shù),它接受一個(gè)整型參數(shù) seconds
,代表需要轉(zhuǎn)換的總秒數(shù)。該函數(shù)計(jì)算出對(duì)應(yīng)的小時(shí)、分鐘和秒數(shù),并使用 snprintf
函數(shù)將格式化后的時(shí)間字符串寫入到 timeStr
數(shù)組中。
在 main
函數(shù)中,我們可以調(diào)用 formatTime
函數(shù)來(lái)進(jìn)行測(cè)試,并將得到的字符串輸出。注意,我們需要使用 %s
格式化字符串輸出,并且需要使用 static
關(guān)鍵字聲明 timeStr
數(shù)組,以便在函數(shù)返回后仍然可以訪問(wèn)。
【4】浮點(diǎn)數(shù)補(bǔ)齊
固定浮點(diǎn)數(shù)輸出的長(zhǎng)度。
double x = 123.456789; printf("溫度:%8.2f", x);
這段代碼的作用是將變量 x
的值輸出到屏幕上,同時(shí)格式化輸出為一個(gè)浮點(diǎn)數(shù)(保留兩位小數(shù),并且右對(duì)齊,總寬度為8),前面加上“溫度:”字樣。
具體來(lái)說(shuō):
%8.2f
是格式化字符串,其中%f
表示要輸出的是一個(gè)浮點(diǎn)數(shù),.2
表示要保留兩位小數(shù),而8
則表示總寬度為8(不足部分右對(duì)齊,左邊補(bǔ)空格)。- 在
printf
函數(shù)中,我們使用%
符號(hào)來(lái)引用這個(gè)格式化字符串,并將x
作為參數(shù)傳遞進(jìn)去。
【5】onenet數(shù)據(jù)組合
OneNet是由中國(guó)移動(dòng)打造的物聯(lián)網(wǎng)云平臺(tái),它提供了一個(gè)完整的物聯(lián)網(wǎng)解決方案,包括設(shè)備接入、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)分析和應(yīng)用開發(fā)等功能。OneNet為用戶提供了一系列的API,使得開發(fā)者能夠輕松地將自己的設(shè)備連接到云端,并通過(guò)云端進(jìn)行實(shí)時(shí)監(jiān)測(cè)和控制。同時(shí),OneNet還提供了強(qiáng)大的數(shù)據(jù)分析工具,幫助用戶更好地理解和利用設(shè)備產(chǎn)生的海量數(shù)據(jù)。作為全球領(lǐng)先的物聯(lián)網(wǎng)云平臺(tái)之一,OneNet已經(jīng)被廣泛應(yīng)用于智能家居、智慧城市、工業(yè)物聯(lián)網(wǎng)等領(lǐng)域。
OneNet支持多種協(xié)議接入,其中局包括了HTTP協(xié)議,單片機(jī)可以利用HTTP配合WIFI或者GPRS模塊向OneNet上傳報(bào)文,而組合HTTP報(bào)文的時(shí)候,就需要填數(shù)據(jù)內(nèi)容的長(zhǎng)度,由于是采集傳感器的數(shù)據(jù)組合報(bào)文上傳,每次采集的傳感器數(shù)據(jù)長(zhǎng)度肯定會(huì)不一樣,為了不再重復(fù)計(jì)算整個(gè)報(bào)文的字符串長(zhǎng)度,我們可以利用sprintf固定數(shù)據(jù)的長(zhǎng)度,這樣每次組合的報(bào)文數(shù)據(jù)長(zhǎng)度就是一致的,省去了單獨(dú)計(jì)算長(zhǎng)度的過(guò)程。
char OneNet_HTTP_CMD[1024]; #define ONENET_DEVICE_ID "1025640558" #define ONENET_API_KEY "gOp2NkgQEt3=EQY7ei61suGjgIg=" /* 函數(shù)功能: 采用HTTP協(xié)議方式向OneNet服務(wù)器上報(bào)GPS經(jīng)緯度信息 函數(shù)參數(shù): char *data_point:數(shù)據(jù)點(diǎn)的名稱 double Longitude,double latitude:上傳的經(jīng)緯度數(shù)據(jù) */ void OneNet_HTTP_GPS_DataUpdate(double Longitude, double latitude) { //拼接數(shù)據(jù) snprintf(OneNet_HTTP_CMD, sizeof(OneNet_HTTP_CMD), "POST /devices/%s/datapoints HTTP/1.1\r\n" \ "api-key:%s\r\n" \ "Host:api.heclouds.com\r\n" \ "Connection:close\r\n" \ "Content-Length:160\r\n" \ "\r\n" \ "{"datastreams":[{"id":"gps","datapoints":[{"value":{"lon":%8.6f,"lat":%8.6f}}]},{"id":"gps2","datapoints":[{"value":{"lon":%10.6f,"lat":%10.6f}}]}]}", ONENET_DEVICE_ID, ONENET_API_KEY, Longitude, latitude, Longitude, latitude); ? printf("GPS_OneNet_HTTP_CMD=%s\r\n", OneNet_HTTP_CMD); printf("%s\r\n", OneNet_HTTP_CMD); } ? int main() { OneNet_HTTP_GPS_DataUpdate(Longitude,latitude); return 0; }
到此這篇關(guān)于C語(yǔ)言利用sprintf固定字符串輸出位數(shù)的文章就介紹到這了,更多相關(guān)C語(yǔ)言sprintf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言初識(shí)變量常量字符串轉(zhuǎn)義符及注釋方式簡(jiǎn)介
最強(qiáng)的C語(yǔ)言筆記,此處對(duì)于C語(yǔ)言的基礎(chǔ)部分做一個(gè)簡(jiǎn)要的介紹,作者實(shí)屬初學(xué),寫博客也是作者學(xué)習(xí)的一個(gè)過(guò)程,若文中內(nèi)容有理解不到位或者有不當(dāng)之處,還請(qǐng)朋友們不吝指正2021-11-11Visual Studio 2019 Professional 激活方法詳解
這篇文章主要介紹了Visual Studio 2019 Professional 激活方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05C語(yǔ)言實(shí)現(xiàn)隊(duì)列的示例詳解
隊(duì)列是一種特殊的線性表,特殊之處在于它只允許在表的前端(head)進(jìn)行刪除操作,而在表的后端(tail)進(jìn)行插入操作。本文將用C語(yǔ)言實(shí)現(xiàn)隊(duì)列,感興趣的可以了解一下2022-06-06C語(yǔ)言冒泡排序法的實(shí)現(xiàn)(升序排序法)
這篇文章主要介紹了C語(yǔ)言冒泡排序法的實(shí)現(xiàn)(升序排序法),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09C++ auto自動(dòng)類型推導(dǎo)規(guī)則和使用詳解
C++11 賦予 auto 關(guān)鍵字新的含義,使用它來(lái)做自動(dòng)類型推導(dǎo)。也就是說(shuō),使用了 auto 關(guān)鍵字以后,編譯器會(huì)在編譯期間自動(dòng)推導(dǎo)出變量的類型,這樣我們就不用手動(dòng)指明變量的數(shù)據(jù)類型了2022-08-08二叉樹中葉子節(jié)點(diǎn)的統(tǒng)計(jì)和樹高問(wèn)題
今天小編就為大家分享一篇關(guān)于二叉樹中葉子節(jié)點(diǎn)的統(tǒng)計(jì)和樹高問(wèn)題,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03C語(yǔ)言鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07