亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言中sscanf()函數的字符串格式化用法

2020-01-26 14:28:23
字體:
來源:轉載
供稿:網友

介紹

     sscanf()為C語言標準庫函數,用于從指定字符串中讀入與指定格式相符的數據。函數原型聲明在stdio.h頭文件中:

int sscanf(const char *str, const char *format, ...);

     該函數根據參數format(格式化字符串)來轉換參數str指向的字符串,轉換后的結果存于對應的可變參數內。其返回值為按照指定格式轉換符成功讀入且賦值的可變參數數目(若發生匹配錯誤而部分成功,該數目會小于指定的參數數目,甚至為0)。若首次成功轉換或錯誤匹配發生前輸入已結束(如str為空字符串),則返回EOF。發生讀取錯誤時也返回EOF,且設置錯誤碼errno(如format為空指針時返回EOF并設置errno為EINVAL)??梢姡ㄟ^比較該函數的返回值與指定的可變參數數目,可判斷格式轉換是否成功。

     format可為一個或多個{%[*] [width] [{h | l | L}]type | ' ' | '/t' | '/n' | 非%符號}格式轉換符。集合中{a|b|c}表示格式符a、b、c任選其一。以中括號括起來的格式符可選。%與type為必選,所有格式符必須以%開頭。 

 以下簡要說明各格式符的含義:

     1) 賦值抑制符'*'表明按照隨后的轉換符指示來讀取輸入,但將其丟棄不予賦值(“跳過”)。抑制符無需相應的指針可變參數,該轉換也不計入函數返回的成功賦值次數。%*[width] [{h | l | L}]type 表示滿足該條件的字符被過濾掉,不會向目標參數中賦值。

     2) width表示最大讀取寬度。當讀入字符數超過該值,或遇到不匹配的字符時,停止讀取。多數轉換丟棄起始的空白字符。這些被丟棄的字符及轉換結果添加的空結束符('/0')均不計入最大讀取寬度。

     3) {h | l | L}為類型修飾符。h指示輸入的數字數值以short intunsigned short int類型存儲;hh指示輸入以signed charunsigned char類型存儲。l(小寫L)指示輸入以long intunsigned long intdouble類型存儲,若與%c或%s結合則指示輸入以寬字符或寬字符串存儲;ll等同L。L指示輸入以long long類型存儲。

     4) type 為類型轉換符,如%s、%d。

此外,還有兩種特殊的格式符:

     1) []:字符集合。[]表示指定的字符集合匹配非空的字符序列;^則表示過濾。該操作不會跳過空白字符(空格、制表或換行符),因此可用于目標字符串不以空白字符分隔時。[]內可有一到多個非^字符(含連字符'-'),且無順序要求。%[a-z]表示匹配a到z之間的任意字符,%[aB-]匹配a、B、-中的任一字符;%[^a]則匹配非a的任意字符,即獲取第一個a之前的(不為a的)所有字符。^可作用于多個條件,如^a-z=表示^a-z且^=(既非小寫字母亦非等號)。空字符集%[]和%[^]會導致不可預知的結果。

     使用[]時接收輸入的參數必須是有足夠存儲空間的char、signed charunsigned char數組。[]也是轉換符,故%[]后無s。

   %[^]的含義和用法與正則表達式相同,故sscanf函數某種程度上提供了簡單的正則表達式功能。

     2) n:至此已讀入值(未必賦值)的等價字符數,該數目必須以int類型存儲。如"10,22"經過"%d%*[^0-9]%n"格式轉換后,%n對應的參數值為3(雖然','未參與賦值)。

     'n'并非轉換符,盡管它可用'*'抑制。C標準聲稱,執行%n指令并不增加函數返回的賦值次數;但其勘誤表中的描述與之矛盾。建議不要假設%n對返回值的影響。

 

下表列舉sscanf函數常見的格式化用法:

此外,還有如下幾種用法:

    【例1】讀入一行字符串

     因字符串可能含空白字符,故不能直接使用%s;而gets函數存在溢出風險,不推薦使用。此時,可使用sscanf函數,格式化字符串設為"%[^/n]%*c"。%*c用于跳過換行符/n,以便再次讀入下一行。

    【例2】提取"Name = Yuan"中的"Name"

     若行首有空白字符,可用"%*[ /t]%[^= /t]"格式串;

     若不確定行首有無空白字符,可先跳過空白字符:

char szName[] = "Name  =  Yuan";char szResBuf[32] = {0};sscanf(szName+strspn(szName," /t"), "%[^= /t]", szResBuf);

    【例3】分解URL

     普通實現如下所示:

/***************************************************************************** * 函數名稱:OaSplitPwFarEndIpInfo * 功能描述:將遠端IP信息分解為目的IP地址和端口號 * 注意事項:遠端IP信息應形如'udp://192.168.100.221:5000'*****************************************************************************/static FUNC_STATUS OaSplitPwFarEndIpInfo(INT8U *pucFarEndIpInfo, INT32U *dwDstUdpPort, INT8U *pucDstIpAddr){  FUNC_STATUS retCode = S_OK;  INT8U strUdpHead[] = "udp://";  INT8U ucUdpUrlLen = strlen(strUdpHead);  INT8U ucIndex = 0;  CHECK_TRIPLE_POINTER(pucFarEndIpInfo, dwDstUdpPort, pucDstIpAddr, S_NULL_POINTER);  if(strncasecmp(pucFarEndIpInfo, strUdpHead, ucUdpUrlLen) != 0)  {    OmciLog(LOG_CES,"[%s]Cannot Parse FarEndIpInfo(%s)!/n/r", __FUNCTION__, pucFarEndIpInfo);    return S_ERROR;  }  INT8U ucMaxUrlLen = ucUdpUrlLen + STR_IPV4_MAX_LEN; //避免未配置端口時陷入死循環(infinite loop)  for(ucIndex = 0; (pucFarEndIpInfo[ucUdpUrlLen] != ':') && (ucUdpUrlLen < ucMaxUrlLen); ucIndex++)  {    pucDstIpAddr[ucIndex] = pucFarEndIpInfo[ucUdpUrlLen++];  }  pucDstIpAddr[ucIndex] = '/0';  *dwDstUdpPort = strtoul(&pucFarEndIpInfo[ucUdpUrlLen+1], NULL, 10);  return retCode;}

     使用sscanf格式化則更為簡單:

char szUrl[] = "udp://192.168.100.221:5000";char szProt[4] = {0}, szIp[32] = {0};unsigned int dwPort = 0;sscanf(szUrl, "%[^://]%*c%*c%*c%[^:]%*c%d", szProt, szIp, &dwPort);printf("szProt=%s, szIp=%s, dwPort=%d/n", szProt, szIp, dwPort);

    【例4】提取數字

char szDig[]="10,22m,Z86,,880;555:666."; int dwIdx = 0, dwVal = 0, dwSize = 0;while(1 == sscanf(szDig+dwIdx, "%d%*[^0-9]%n", &dwVal, &dwSize)){  dwIdx += dwSize;  printf("dwIdx=%d, dwSize=%d, dwVal=%d/n", dwIdx, dwSize, dwVal); }

     上述實現稍加改造,即可用于處理某種字符分隔的數字串。

總結 

     綜上,對于簡單的字符串分析,采用sscanf函數處理比較簡潔。若字符串比較復雜,則可借助相應的正則表達式庫。需要注意,sscanf格式化的目的是“截取”,而正則表達式的目的是“匹配”,不能完全等同。

     以上就是本文的全部內容改了,希望對大家的學習能有所幫助,如果疑問的話歡迎大家留言討論。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品视频在线观看| 国产suv精品一区二区| 国产91ⅴ在线精品免费观看| 日韩欧美国产激情| 国产视频一区在线| 国产精品一区=区| 成人中文字幕+乱码+中文字幕| 久久久久999| 久久久精品免费视频| 国产精品福利网站| 亚洲欧美国产精品| 亚洲欧美日韩另类| 久久影院资源站| 91精品在线影院| 中文字幕日韩精品有码视频| 欧美精品精品精品精品免费| 人人爽久久涩噜噜噜网站| 欧美老女人在线视频| 欧美一级黄色网| 午夜精品久久久久久久久久久久久| 国产91ⅴ在线精品免费观看| 一本色道久久综合亚洲精品小说| 欧美最顶级的aⅴ艳星| 亚洲国产精彩中文乱码av| 中文字幕亚洲天堂| 日韩福利伦理影院免费| www.久久久久久.com| 国产精品久久久久久久久久久新郎| 国产91av在线| 国产69久久精品成人| 亚洲精品成人网| 久久精品国产96久久久香蕉| 国产欧亚日韩视频| 成人午夜在线观看| 日韩欧美国产激情| 欧美午夜xxx| 国产精品久久久久久久美男| 久久久久久久国产| 久久久精品影院| 国模精品一区二区三区色天香| 青青草原成人在线视频| 国产婷婷色综合av蜜臀av| 欧美黑人巨大xxx极品| 欧美视频在线观看免费| 日本午夜人人精品| 欧美成人免费小视频| 日韩免费电影在线观看| 日韩中文字幕在线免费观看| 大桥未久av一区二区三区| 按摩亚洲人久久| 亚洲精品自产拍| 国产欧美精品一区二区三区介绍| 九九久久久久99精品| 97久久超碰福利国产精品…| 色偷偷偷综合中文字幕;dd| 91中文字幕一区| 最新日韩中文字幕| 亚洲精品国产综合区久久久久久久| 久久精品国产亚洲精品2020| 最新国产成人av网站网址麻豆| 日韩精品极品视频免费观看| 欧美成人精品h版在线观看| 久久久久久一区二区三区| 欧美色视频日本版| 欧美精品videos性欧美| 亚洲精品日产aⅴ| 国产一区二区久久精品| 538国产精品视频一区二区| 亚洲欧美国产视频| 亚洲一区二区三区在线免费观看| 91av免费观看91av精品在线| 久久久免费电影| 欧美电影在线免费观看网站| 日韩av在线一区二区| 国产成人jvid在线播放| 国产精品白嫩初高中害羞小美女| 欧美韩日一区二区| 亚洲欧美中文日韩v在线观看| 成人免费在线网址| 欧美在线性视频| 北条麻妃一区二区在线观看| 懂色av影视一区二区三区| 国产999在线观看| www欧美日韩| 国产精品视频中文字幕91| 国产精品一区二区三区在线播放| 精品国产91久久久| 久久久久国产精品一区| 欧美日韩一区二区三区在线免费观看| 日韩有码在线播放| 高清一区二区三区四区五区| 欧美性xxxxxxxxx| 亚洲精品一区中文字幕乱码| 亚洲成人精品视频| 成人国产精品一区二区| 成人免费看黄网站| 亚洲欧美在线磁力| 中文字幕亚洲一区在线观看| 国产精品99久久久久久人| 一区二区av在线| 色777狠狠综合秋免鲁丝| 亚洲色图第一页| 亚州av一区二区| 国产一区二区三区在线看| 成人激情黄色网| 久久精品国产91精品亚洲| 国产精品久久久久久久久久久不卡| 欧美午夜精品伦理| 亚洲一级片在线看| 亚洲iv一区二区三区| 中文字幕日韩电影| 国产精品久久久久久久久久ktv| 日韩免费av片在线观看| 国产主播在线一区| 亚洲自拍偷拍在线| 精品国偷自产在线| 国产精品久久久久久久久免费看| 色悠悠久久久久| 亚洲国产精品va在线| 国产乱人伦真实精品视频| 91亚洲精品在线| 久久久亚洲国产天美传媒修理工| 国产精品青青在线观看爽香蕉| 日韩网站免费观看| 国产+成+人+亚洲欧洲| 不卡av日日日| 亚洲欧美日韩国产精品| 亚洲欧美一区二区精品久久久| 亚洲精品在线看| 日韩精品视频免费| 2021久久精品国产99国产精品| 欧美整片在线观看| 欧美理论电影在线播放| 92看片淫黄大片欧美看国产片| 国产精品欧美激情在线播放| 亚洲午夜女主播在线直播| 热久久视久久精品18亚洲精品| 国产精品毛片a∨一区二区三区|国| 欧美激情视频在线免费观看 欧美视频免费一| 激情成人中文字幕| 日本韩国欧美精品大片卡二| 亚洲欧美日韩精品久久奇米色影视| 在线丨暗呦小u女国产精品| 国产精品欧美风情| 久久影视电视剧免费网站清宫辞电视| 国产午夜精品美女视频明星a级| 日韩不卡在线观看| 欧美日韩人人澡狠狠躁视频| 成人免费福利视频| 黑人精品xxx一区一二区| 亚洲激情小视频| 亚洲欧美制服另类日韩| 亚洲情综合五月天| 亚洲午夜精品久久久久久久久久久久| 欧美日韩国产综合视频在线观看中文| 日韩av在线看| 久久久中精品2020中文| 欧美黑人又粗大| 欧美成人高清视频| 欧美性视频精品| 91久久中文字幕| 日本欧美精品在线| 中文字幕av一区| 日韩在线观看你懂的|