首頁 > 軟體

C語言利用sprintf固定字串輸出位數

2023-03-17 06:05:26

一、前言

sprintf 函數是一個 C 語言中的函數,也被許多其他程式語言所支援。它允許你根據一組變數來格式化和儲存一個字元字串。sprintf 函數可以用於將格式化的資料寫入字元陣列或字串中,然後根據需要列印或儲存該字串。sprintf 函數的第一個引數是格式化資料將被寫入的字元陣列或字串,隨後的引數是用於生成格式化輸出的變數。sprintf 函數允許你控制輸出的格式,包括小數點後的位數、欄位的寬度和文字的對齊方式等。

在微控制器專案開發中經常需要通過sprintf組合字串,完成各種資料的列印,顯示等等。

比如:

在微控制器裡通過LCD屏顯示感測器資料的時候,如果不固定字串長度,每次從感測器讀取的資料長度可能都不一樣,一般都會先清屏再顯示,或者先使用空格清除顯示,再顯示實際資料。這種在LCD重新整理頻率比較低的情況下肉眼會看出螢幕閃爍的效果。 為了方便顯示,我們可以使用sprintf固定最終資料的長度,預置好感測器最大輸出的長度進行顯示,後期採集的資料如果不夠長度,就以空格補齊。這樣呼叫顯示函數就很方便了,不需要擔心清屏問題。

二、案例

【1】多個整數輸出補齊

我們讀取到DS18B20溫度,需要顯示在LCD顯示屏上。我們將得到的溫度固定長度為5個字元的字串,顯示到LCD屏上。

char DS18B20_str[10];
DS18B20=readDs18b20();
sprintf(DS18B20_str, "%02d.%01d", DS18B20 >> 4, DS18B20 & 0xF);

這裡,我們使用了%02d和%01d格式化字串來指定輸出數位的位數。%02d表示要輸出兩位數位,並在前面補零(如果需要),而%01d表示要輸出一位數位。因此,上面的程式碼將會列印出一個形如"12.3 "(注意最後的空格)的字串,其中數位部分總共有5個字元(包括小數點)。

【2】單個整數輸出補齊

char mqtt_message[10];
water_hp=read_water_hp();
sprintf(mqtt_message, "%3d", water_hp);

這將把 water_hp 轉換為一個 3 位寬的字串,並根據需要在左邊用空格填充。如果 water_hp 不足 3 位,它將被左側填充空格以達到 3 位的寬度。

【3】固定時間長度

下面是一個將秒轉為時分秒輸出的C語言函數:

#include <stdio.h>
#include <string.h>
 ​
char* formatTime(int seconds) {
    static char timeStr[9]; // 時分秒格式化後最多佔用8個字元,再加上''結束符
    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("%sn", timeStr);
    return 0;
}

這個程式中,formatTime 是我們建立的子函數,它接受一個整型引數 seconds,代表需要轉換的總秒數。該函數計算出對應的小時、分鐘和秒數,並使用 snprintf 函數將格式化後的時間字串寫入到 timeStr 陣列中。

main 函數中,我們可以呼叫 formatTime 函數來進行測試,並將得到的字串輸出。注意,我們需要使用 %s 格式化字串輸出,並且需要使用 static 關鍵字宣告 timeStr 陣列,以便在函數返回後仍然可以存取。

【4】浮點數補齊

固定浮點數輸出的長度。

double x = 123.456789;
printf("溫度:%8.2f", x);

這段程式碼的作用是將變數 x 的值輸出到螢幕上,同時格式化輸出為一個浮點數(保留兩位小數,並且右對齊,總寬度為8),前面加上“溫度:”字樣。

具體來說:

  • %8.2f 是格式化字串,其中 %f 表示要輸出的是一個浮點數,.2 表示要保留兩位小數,而 8 則表示總寬度為8(不足部分右對齊,左邊補空格)。
  • printf 函數中,我們使用 % 符號來參照這個格式化字串,並將 x 作為引數傳遞進去。

【5】onenet資料組合

OneNet是由中國移動打造的物聯網雲平臺,它提供了一個完整的物聯網解決方案,包括裝置接入、資料儲存、資料分析和應用開發等功能。OneNet為使用者提供了一系列的API,使得開發者能夠輕鬆地將自己的裝置連線到雲端,並通過雲端進行實時監測和控制。同時,OneNet還提供了強大的資料分析工具,幫助使用者更好地理解和利用裝置產生的海量資料。作為全球領先的物聯網雲平臺之一,OneNet已經被廣泛應用於智慧家居、智慧城市、工業物聯網等領域。

OneNet支援多種協定接入,其中局包括了HTTP協定,微控制器可以利用HTTP配合WIFI或者GPRS模組向OneNet上傳報文,而組合HTTP報文的時候,就需要填資料內容的長度,由於是採集感測器的資料組合報文上傳,每次採集的感測器資料長度肯定會不一樣,為了不再重複計算整個報文的字串長度,我們可以利用sprintf固定資料的長度,這樣每次組合的報文資料長度就是一致的,省去了單獨計算長度的過程。

char OneNet_HTTP_CMD[1024];
#define ONENET_DEVICE_ID "1025640558"
#define ONENET_API_KEY "gOp2NkgQEt3=EQY7ei61suGjgIg="
 
/*
函數功能: 採用HTTP協定方式向OneNet伺服器上報GPS經緯度資訊
函數引數:
                char *data_point:資料點的名稱
                double Longitude,double latitude:上傳的經緯度資料
*/
void OneNet_HTTP_GPS_DataUpdate(double Longitude, double latitude)
{
    //拼接資料
    snprintf(OneNet_HTTP_CMD, sizeof(OneNet_HTTP_CMD),
        "POST /devices/%s/datapoints HTTP/1.1rn" 
        "api-key:%srn" 
        "Host:api.heclouds.comrn" 
        "Connection:closern" 
        "Content-Length:160rn" 
        "rn" 
        "{"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=%srn", OneNet_HTTP_CMD);
 
    printf("%srn", OneNet_HTTP_CMD);
}
​

int main()
{
    OneNet_HTTP_GPS_DataUpdate(Longitude,latitude);
    return 0;
}

到此這篇關於C語言利用sprintf固定字串輸出位數的文章就介紹到這了,更多相關C語言sprintf內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com