1. 程式人生 > >再記一下sscanf的一個小問題

再記一下sscanf的一個小問題

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

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

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

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

示例程式碼如下:

void sscanf_test()

{
    char* buff = "wo:[12],ni:[25],ta:[中文我頂]";
    char wo[32] = {0};
    char ni[32] = {0};
    char ta[32] = {0};
    char buffer[128] = {0};
    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 // 此處已是錯誤的了

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

相關推薦

一下sscanf一個問題

正在進行的專案中有個網路傳輸模組,需要在裝置端將上位機發送的XML命令解析出來並轉發到其它模組。在我測試一個獲取資料的命令時,發現上位機讀取到的資料是錯誤,看XML命令格式,明明是對的,但讀到的資料就是不正確,肯定有問題。因為網路傳輸模組在其它專案一直使用,一直OK,現在出

dynamic的一個坑 -- RuntimeBinderException:“object”未包括“xxx”的定義

idt time 集中 names 屬性 trac 匿名 nal library 創建一個控制臺程序和一個類庫, 在控制臺創建一個匿名對象。然後再在類庫中訪問它。代碼例如以下: namespace ConsoleApplication1 { cla

一下mybatis中foreach循環遇到的一個問題

apach binding ibatis div 元素 each循環 ram nes 結束 ---恢復內容開始--- 我在添加單條數據的時候,參數是一個map,沒有使用循環,直接map.字段,即使這個字段map中並不存在,也不會出錯 但是是一個List<Map>

一個總結吧,把別人的經驗拿來總結一下

spa range 簡單的 pan att 切片 XML append filter 構造一個1, 3, 5, 7, ..., 99的列表,可以通過循環實現: 取list的前一半的元素,也可以通過循環實現: 1. L = [] n = 1 while n <= 9

201671010127 2016—2017-2 通過一個程序對Java的認識。

實現 字符串和字符 代碼 generated 字符串的操作 以及 math ext 兩個   學習了將近四周的Java語言,對於Java語言,我也有了更進一步的理解,出於對Java語言的喜愛,我總是喜歡沒事的時候,自己敲一些很簡單的代碼,一邊學習Java語言,一邊對比C語言

有沒有python高手出來解答一下一個問題?

1、剛學python,自學的,看的一本網上下載的python書籍,完成課後習題的時候,有一個地方出了問題,百思不得其解,所以求助一下廣大網友,問題如下: 檔案test.txt中包含以下內容: 今年是2014年。 2014年你好。 2014年再見。 要求: 去掉檔

一下學習BFS之後的筆記以及虛擬碼

BFS,全稱Breadth First Search,寬度優先搜尋演算法(又稱廣度優先搜尋)。 運用佇列先進先出的特點來遍歷所有情況。由於是寬度優先,所以會一層一層遍歷所有情況,可以以此特性來求解搜尋路徑的最小值。 虛擬碼(我理解中的): /* * 首先先定義需

一個白的第一次社招面試

在51job上投了好幾家簡歷,最後只有一家打電話約我去面試(可能51job上的簡歷寫得太差了吧--|||),約的是下午三點,結果我兩點40就到了,剛好沒有人來面試,就直接給我面了。 先是做了個自我介紹,然後面試官就拿著簡歷開始問我。 談談你對於redis的理解(自己作死,

一下機器學習筆記 最均方(LMS)演算法

這裡是《神經網路與機器學習》第三章的筆記… 最小均方演算法,即Least-Mean-Square,LMS。其提出受到感知機的啟發,用的跟感知機一樣的線性組合器。 在意義上一方面LMS曾被用在了濾波器上,另一方面對於LMS的各種最優化方式為反向傳播演算法提供了

HTML5 標籤的一個

今天寫了段簡單的程式碼,點選<a>標籤時卻丟擲了這個錯誤:Uncaught TypeError: download is not a function。程式碼如下: <!DOCTYPE html> <html lang="en

安卓中利用TranslateAnimation實現圖片迴圈移動時候的出現的一個問題,在這裡一下

要利用安卓的Animation實現一個圖片的迴圈移動效果,在這裡要使用到setAnimationListener. 但是在其中的onAnimationEnd()方法中設定圖片的visibility屬性的時候, 用setVisibility()進行設定,程式邏輯上沒有問題,但

css3的一個demo(箭頭hover變化)

rotate osi ping align pos ref block translate -m 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta char

關於JSON call 的一個問題

cnblogs 分享 image .com cal 問題 技術 不出 del 如圖當我們在做Json call 的時候,一定要切記,建立的model 一定要與JSON 字符串嚴格的一一對應,否者會解析不出來 關於JSON call 的一個小問題

窺R(包括一個R示例)

生成 內容 功能 幫助 顯示 sta alt 利用 red 一、將輸出作為輸入——結果的重用   R有個特點,分析的結果可以保存下來,並可以作為進一步分析的輸入使用。下面我們通過R中的預先安裝好的數據集作為實例(這裏只講述原理,涉及到的統計知識,以後在另外的統計專欄中描述)

perl_來來來,解讀一個程序

二次 html money cnblogs font 最後一個元素 沒有 web .html #!/usr/bin/perl -w #by www.yiibai.com @array = qw(This is a list of words without interp

linux下開發,解決cocos2d-x中編譯出現的一個問題, undefined reference to symbol &#39;pthread_create@@GLIBC_2.2.5&#39;

water span x86 code bject data- ace 技術分享 inux 解決cocos2d-x中編譯出現的一個小問題 對於cocos2d-x 2.×中編譯中,若頭文件裏引入了#include "cocos-ext.h",在進行C++編譯的時候會遇到例

php中引用&的一個實例

應該 數量 保存 cnblogs 理解 循環 簡單的 執行 次循環 在百度知道上碰到一段關於php的引用符&的代碼,對於初學都來說還是很考驗理解分析能力的,把代碼和自己的分析貼上來作一個備份,也與大家共勉。 代碼片段: 1 $arr =array(1,2,3

BeX5開發中MySQL視圖使用的一個問題

bex5開發中mysql視圖使用的一個小問題問題 數據操作中的查詢是極端重要的,使用頻繁。MySQL數據庫中視圖概念的存在十分類似於微軟Access小型關系數據庫中的查詢(二級考試重點)。視圖的存在極大減小了數據表的創建數量,而且還有更為高級的運用技巧。本文介紹在基於起步科技的BeX5平臺上使用MySQ

python練習冊 每天一個程序

註釋 and ati 註意 繪圖 windows 操作 jpeg odi PIL庫學習鏈接:http://blog.csdn.net/column/details/pythonpil.html?&page=1 1 #-*-coding:utf-8-*- 2 _

python練習冊 每天一個程序 第0002題

color == oot 關系型數據庫 auth creat user root mdb 1 #-*-coding:utf-8-*- 2 __author__ = ‘Deen‘ 3 ‘‘‘ 4 題目描述: 5 將 0001 題生成的 200 個激活碼