C語言利用sprintf固定字符串輸出位數(shù)
一、前言
sprintf 函數(shù)是一個 C 語言中的函數(shù),也被許多其他編程語言所支持。它允許你根據(jù)一組變量來格式化和存儲一個字符字符串。sprintf 函數(shù)可以用于將格式化的數(shù)據(jù)寫入字符數(shù)組或字符串中,然后根據(jù)需要打印或存儲該字符串。sprintf 函數(shù)的第一個參數(shù)是格式化數(shù)據(jù)將被寫入的字符數(shù)組或字符串,隨后的參數(shù)是用于生成格式化輸出的變量。sprintf 函數(shù)允許你控制輸出的格式,包括小數(shù)點后的位數(shù)、字段的寬度和文本的對齊方式等。
在單片機項目開發(fā)中經(jīng)常需要通過sprintf組合字符串,完成各種數(shù)據(jù)的打印,顯示等等。
比如:
在單片機里通過LCD屏顯示傳感器數(shù)據(jù)的時候,如果不固定字符串長度,每次從傳感器讀取的數(shù)據(jù)長度可能都不一樣,一般都會先清屏再顯示,或者先使用空格清除顯示,再顯示實際數(shù)據(jù)。這種在LCD刷新頻率比較低的情況下肉眼會看出屏幕閃爍的效果。 為了方便顯示,我們可以使用sprintf固定最終數(shù)據(jù)的長度,預置好傳感器最大輸出的長度進行顯示,后期采集的數(shù)據(jù)如果不夠長度,就以空格補齊。這樣調(diào)用顯示函數(shù)就很方便了,不需要擔心清屏問題。
二、案例
【1】多個整數(shù)輸出補齊
我們讀取到DS18B20溫度,需要顯示在LCD顯示屏上。我們將得到的溫度固定長度為5個字符的字符串,顯示到LCD屏上。
char DS18B20_str[10]; DS18B20=readDs18b20(); sprintf(DS18B20_str, "%02d.%01d", DS18B20 >> 4, DS18B20 & 0xF);
這里,我們使用了%02d和%01d格式化字符串來指定輸出數(shù)字的位數(shù)。%02d表示要輸出兩位數(shù)字,并在前面補零(如果需要),而%01d表示要輸出一位數(shù)字。因此,上面的代碼將會打印出一個形如"12.3 "(注意最后的空格)的字符串,其中數(shù)字部分總共有5個字符(包括小數(shù)點)。
【2】單個整數(shù)輸出補齊
char mqtt_message[10]; water_hp=read_water_hp(); sprintf(mqtt_message, "%3d", water_hp);
這將把 water_hp 轉換為一個 3 位寬的字符串,并根據(jù)需要在左邊用空格填充。如果 water_hp 不足 3 位,它將被左側填充空格以達到 3 位的寬度。
【3】固定時間長度
下面是一個將秒轉為時分秒輸出的C語言函數(shù):
#include <stdio.h>
#include <string.h>
?
char* formatTime(int seconds) {
static char timeStr[9]; // 時分秒格式化后最多占用8個字符,再加上'\0'結束符
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;
}
這個程序中,formatTime 是我們創(chuàng)建的子函數(shù),它接受一個整型參數(shù) seconds,代表需要轉換的總秒數(shù)。該函數(shù)計算出對應的小時、分鐘和秒數(shù),并使用 snprintf 函數(shù)將格式化后的時間字符串寫入到 timeStr 數(shù)組中。
在 main 函數(shù)中,我們可以調(diào)用 formatTime 函數(shù)來進行測試,并將得到的字符串輸出。注意,我們需要使用 %s 格式化字符串輸出,并且需要使用 static 關鍵字聲明 timeStr 數(shù)組,以便在函數(shù)返回后仍然可以訪問。
【4】浮點數(shù)補齊
固定浮點數(shù)輸出的長度。
double x = 123.456789;
printf("溫度:%8.2f", x);
這段代碼的作用是將變量 x 的值輸出到屏幕上,同時格式化輸出為一個浮點數(shù)(保留兩位小數(shù),并且右對齊,總寬度為8),前面加上“溫度:”字樣。
具體來說:
%8.2f是格式化字符串,其中%f表示要輸出的是一個浮點數(shù),.2表示要保留兩位小數(shù),而8則表示總寬度為8(不足部分右對齊,左邊補空格)。- 在
printf函數(shù)中,我們使用%符號來引用這個格式化字符串,并將x作為參數(shù)傳遞進去。
【5】onenet數(shù)據(jù)組合
OneNet是由中國移動打造的物聯(lián)網(wǎng)云平臺,它提供了一個完整的物聯(lián)網(wǎng)解決方案,包括設備接入、數(shù)據(jù)存儲、數(shù)據(jù)分析和應用開發(fā)等功能。OneNet為用戶提供了一系列的API,使得開發(fā)者能夠輕松地將自己的設備連接到云端,并通過云端進行實時監(jiān)測和控制。同時,OneNet還提供了強大的數(shù)據(jù)分析工具,幫助用戶更好地理解和利用設備產(chǎn)生的海量數(shù)據(jù)。作為全球領先的物聯(lián)網(wǎng)云平臺之一,OneNet已經(jīng)被廣泛應用于智能家居、智慧城市、工業(yè)物聯(lián)網(wǎng)等領域。
OneNet支持多種協(xié)議接入,其中局包括了HTTP協(xié)議,單片機可以利用HTTP配合WIFI或者GPRS模塊向OneNet上傳報文,而組合HTTP報文的時候,就需要填數(shù)據(jù)內(nèi)容的長度,由于是采集傳感器的數(shù)據(jù)組合報文上傳,每次采集的傳感器數(shù)據(jù)長度肯定會不一樣,為了不再重復計算整個報文的字符串長度,我們可以利用sprintf固定數(shù)據(jù)的長度,這樣每次組合的報文數(shù)據(jù)長度就是一致的,省去了單獨計算長度的過程。
char OneNet_HTTP_CMD[1024];
#define ONENET_DEVICE_ID "1025640558"
#define ONENET_API_KEY "gOp2NkgQEt3=EQY7ei61suGjgIg="
/*
函數(shù)功能: 采用HTTP協(xié)議方式向OneNet服務器上報GPS經(jīng)緯度信息
函數(shù)參數(shù):
char *data_point:數(shù)據(jù)點的名稱
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;
}到此這篇關于C語言利用sprintf固定字符串輸出位數(shù)的文章就介紹到這了,更多相關C語言sprintf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言數(shù)據(jù)(整數(shù)、浮點數(shù))在內(nèi)存中的存儲
之前對c語言數(shù)據(jù)存儲一直不太明白,最近仔細研究了一番,所以下面這篇文章主要給大家介紹了關于C語言數(shù)據(jù)(整數(shù)、浮點數(shù))在內(nèi)存中存儲的相關資料,需要的朋友可以參考下2021-06-06
Unity3D實現(xiàn)經(jīng)典小游戲Pacman
這篇文章主要介紹了基于Unity3D制作一做個經(jīng)典小游戲Pacman,文中的示例代碼講解詳細,對我們學習Unity3D有一定的幫助,感興趣的小伙伴可以了解一下2021-12-12
Qt?QtCreator添加自定義注釋的實現(xiàn)方法
在寫代碼的時候我們?yōu)榱艘?guī)范化,一般會加文件注釋、類注釋和函數(shù)注釋,本文主要介紹了Qt?QtCreator添加自定義注釋的實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下2023-11-11
C++?Qt開發(fā)之使用QUdpSocket實現(xiàn)UDP網(wǎng)絡通信
Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應用程序,本文主要介紹如何運用QUdpSocket組件實現(xiàn)基于UDP的網(wǎng)絡通信功能,需要的可以參考下2024-03-03
GCC 編譯使用動態(tài)鏈接庫和靜態(tài)鏈接庫的方法
根據(jù)鏈接時期的不同,庫又有靜態(tài)庫和動態(tài)庫之分,有別于靜態(tài)庫,動態(tài)庫的鏈接是在程序執(zhí)行的時候被鏈接的2013-03-03

