再記一下sscanf的乙個小問題

2021-06-28 06:26:02 字數 1279 閱讀 5291

正在進行的專案中有個網路傳輸模組,需要在裝置端將上位機傳送的xml命令解析出來並**到其它模組。在我測試乙個獲取資料的命令時,發現上位機讀取到的資料是錯誤,看xml命令格式,明明是對的,但讀到的資料就是不正確,肯定有問題。因為網路傳輸模組在其它專案一直使用,一直ok,現在出問題了,很鬱悶。於是使出printf**跟蹤、終於找到問題原因。原來,又是sscanf搞的問題。記得小弟剛來這家公司時接手前人寫的ftp模組,裡面大量用了sscanf,還專門寫了篇文章。現在又遇到了。

這個xml命令是自定義的,格式類似:大人[1],大奔[黃],大小[250],中括號表示為傳遞的引數,其中既有數字(%d)也有字串(%s),一開始還以為是中文搞的鬼,後來查發現是只要是字元中在命令的中間,使用sscanf的%s就會將該字串及以後的所有的字元都解析到,因此,字串後面的資料就不正確了。

一開始想著使用字串查詢strchr逐個字元來查詢、確定每乙個引數,但那個命令一共有20多個引數,這點我是不能接受的。後來再除錯一下,發現只要將有字串的引數放到最後就可以了。至於最後有個右中括號,則可以將它直接寫'\0'來解決。

不過這種方法,只能適用於只有乙個字串的情況。如果複雜的情況,最終的方法是重新制定命令的格式。

示例**如下:

void sscanf_test()

;char ni[32] = ;

char ta[32] = ;

char buffer[128] = ;

int wo1, ni1, ta1;

printf("test1:\n");

sscanf(buff, "wo:[%d],ni:[%d],ta:[%s]", &wo1, &ni1, ta);

printf("output1:wo: %d \nni: %d \nta: %s\n", wo1, ni1, ta);

char* buff1 = "wo:[12],ni:[結束了還來],ta:[250]";

printf("test2:\n");

sscanf(buff1, "wo:[%d],ni:[%s],ta:[%d]", &wo1, ni, &ta1);

printf("output2:wo: %d\nni: %s \nta: %d\n", wo1, ni, ta1);

輸出:test1:

output1:wo: 12 

ni: 25 

ta: 中文我頂]

test2:

output2:wo: 12

ni: 結束了還來],ta:[250] 

ta: 7 // 此處已是錯誤的了

李遲 2023年1月18日 週日 下午

redis 鎖的乙個小坑紀念一下

之前在工作的過程中做了很多鎖的校驗,有做併發鎖校驗,也有做分布式系統訂單狀態校驗的鎖,但是這次造成線上bug的 是因為自己乙個很小的失誤,這次紀念一下。這次是在解決批量去操作的時候,去將要批量操作的資料去鎖住,防止併發操作 分布式系統互動要注意這種併發和冪等的操作 這裡在迴圈中去加了redis的鎖,...

sscanf 的乙個坑

在一次專案中,偶然使用了sscanf,這裡就不詳細說明它的用法,開門見山,說一下本文的意圖,也希望其他同族兄弟了解。上程式 struct int main int argc,char ar 執行 test enp2s0 12 23 34 45 45 56 列印結果 xyz.b輸出為空 gcc g t...

oracle板塊的乙個帖子小糾結了一下

帖子內容 表 字段 name id aaa 1,2,3 bbb 1,2 結果 name id aaa 1 aaa 2 aaa 3 bbb 1 bbb 2 蘭蘭 select name,regexp substr id,1,n from test a left join select level ro...