嵌入式C語言 sscanf函式使用技巧

2022-09-02 04:06:07 字數 1449 閱讀 3136

嵌入式系統中有很多場所需要解析字串,如解析gps的rmc幀,解析使用者通過串列埠輸入的監控命令等。一般的做法是先接受一幀字元資料,然後用sscanf函式提取相應字段。

int sscanf( const char *buffer, const char *format [, argument ] ... );

sscanf屬於scanf函式家族一員,從輸入源——字串中讀取字元並根據format給出的格式**對它們進行轉換,省略號代表可變長度的指標列表。

format字串引數中的格式**可以由4部分組成:% [*] [width] [h|l|l] 格式碼

如sscanf("...", "%4hd", &short_val)中%4hd表示從字串中提取寬度限制為4個數字的短整型。

rcv_buf = "$read_cpu:0x0012#"

從rcv_buf裡面提取使用者需要讀取的值:

fetch_num = sscanf(rcv_buf, "$read_cpu:%x", &read_address);

如果執行成功,該函式返回值fetch_num等於1,read_address==0x12,提取失敗的話fetch_num==0

*sscanf函式可以提取字串%s,單個字元%c,整型%d,%x,可以指定提取的整型的寬度,指定提取的浮點數的小數字數等等

使用該函式尤其要注意的是:第3部分的指標引數的型別如上述的read_address的型別一定要和第2部分format格式**中的引數的%x相匹配,在提取多個值時,一不小心,後面提取的值會把前面的全部覆蓋掉。舉個例子:

typedef struct

date_t;

date_t current_date = ;

fetch_num = sscanf("$time:20120228", "$time:%4u%2u%2u",¤t_date.year, ¤t_date.month, ¤t_date.day)

按照程式設計師的思路,提取出來的結果應該是:year = 2012, month=2, day = 28,但是實際結果卻是year=0, month = 2, day=28

原因就在於:%u提取的month是32位無符號整型,函式會把目的位址當作乙個32位整形的位址,因此就杯具了,date_t結構體占用4位元組,裡面¤t_date.month實際是指向第1個位元組的位址,如果被當作指向unsigned int的位址,把月份month=0x0000 0002的值拷貝過去,前面提取的占用高2位元組的year就會被覆蓋掉,然後本來提取的year的值變成了0x0000

*sscanf裡的位址所在的引數型別保持和第2部分的format格式化部分一致

typedef struct

date_t;

sscanf函式避免了手工操作字串之類重**明輪子的行為,尤其注意該函式不會驗證指標引數的型別是否對應format格式**中的正確型別。

嵌入式學習(二) 嵌入式系統C 語言

1 從 cpu 復位時的指定位址開始執行 2 跳轉至彙編 startup 處執行 3 跳轉至使用者主程式 main 執行,在 main 中完成 a.初試化各硬體裝置 b.初始化各軟體模組 c.進入死迴圈 無限迴圈 d呼叫各模組的處理函式 下面是幾個 著名 的死迴圈 1 作業系統是死迴圈 2 win3...

嵌入式C語言總結

這幾天花了兩天時間看了一些嵌入式c語言方面的內容,以下是一些讀書筆記,記錄一下。1 不能有返回值 2 不能向isr 傳遞引數 3 isr盡可能的短 4 printf有重入問題 1 中斷服務程式isr 2 硬體初始化 1 某io 晶元被定為在 cpu的儲存空間而非 io空間,而且暫存器對應於某特定位址...

嵌入式c語言優化

一.演算法和資料結構優化 1.針對應用的演算法優化,比如,在音訊編譯碼中,用fft實現時頻變換。2.c語言級別的優化,如排序演算法的選擇。3.資料結構的選擇,如果需要隨機訪問,則盡量選擇陣列,如果需要隨機插入刪除,則可以選擇鍊錶。4.盡量用指標代替資料操作,大部分編譯對於指標會生成更小更快的 5.盡...