最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年08月15日 09:25:15   投稿:daisy  
這篇文章介紹的是C語(yǔ)言中sscanf()函數(shù),本文介紹了sscanf()函數(shù)的含義與用法,對(duì)大家日常使用C語(yǔ)言的sscanf()函數(shù)很有幫助,有需要的可以參考借鑒。

介紹

     sscanf()為C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù),用于從指定字符串中讀入與指定格式相符的數(shù)據(jù)。函數(shù)原型聲明在stdio.h頭文件中:

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

     該函數(shù)根據(jù)參數(shù)format(格式化字符串)來(lái)轉(zhuǎn)換參數(shù)str指向的字符串,轉(zhuǎn)換后的結(jié)果存于對(duì)應(yīng)的可變參數(shù)內(nèi)。其返回值為按照指定格式轉(zhuǎn)換符成功讀入且賦值的可變參數(shù)數(shù)目(若發(fā)生匹配錯(cuò)誤而部分成功,該數(shù)目會(huì)小于指定的參數(shù)數(shù)目,甚至為0)。若首次成功轉(zhuǎn)換或錯(cuò)誤匹配發(fā)生前輸入已結(jié)束(如str為空字符串),則返回EOF。發(fā)生讀取錯(cuò)誤時(shí)也返回EOF,且設(shè)置錯(cuò)誤碼errno(如format為空指針時(shí)返回EOF并設(shè)置errno為EINVAL)??梢?jiàn),通過(guò)比較該函數(shù)的返回值與指定的可變參數(shù)數(shù)目,可判斷格式轉(zhuǎn)換是否成功。

     format可為一個(gè)或多個(gè){%[*] [width] [{h | l | L}]type | ' ' | '\t' | '\n' | 非%符號(hào)}格式轉(zhuǎn)換符。集合中{a|b|c}表示格式符a、b、c任選其一。以中括號(hào)括起來(lái)的格式符可選。%與type為必選,所有格式符必須以%開(kāi)頭。 

 以下簡(jiǎn)要說(shuō)明各格式符的含義:

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

     2) width表示最大讀取寬度。當(dāng)讀入字符數(shù)超過(guò)該值,或遇到不匹配的字符時(shí),停止讀取。多數(shù)轉(zhuǎn)換丟棄起始的空白字符。這些被丟棄的字符及轉(zhuǎn)換結(jié)果添加的空結(jié)束符('\0')均不計(jì)入最大讀取寬度。

     3) {h | l | L}為類型修飾符。h指示輸入的數(shù)字?jǐn)?shù)值以short intunsigned short int類型存儲(chǔ);hh指示輸入以signed charunsigned char類型存儲(chǔ)。l(小寫(xiě)L)指示輸入以long int、unsigned long intdouble類型存儲(chǔ),若與%c或%s結(jié)合則指示輸入以寬字符或?qū)捵址鎯?chǔ);ll等同L。L指示輸入以long long類型存儲(chǔ)。

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

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

     1) []:字符集合。[]表示指定的字符集合匹配非空的字符序列;^則表示過(guò)濾。該操作不會(huì)跳過(guò)空白字符(空格、制表或換行符),因此可用于目標(biāo)字符串不以空白字符分隔時(shí)。[]內(nèi)可有一到多個(gè)非^字符(含連字符'-'),且無(wú)順序要求。%[a-z]表示匹配a到z之間的任意字符,%[aB-]匹配a、B、-中的任一字符;%[^a]則匹配非a的任意字符,即獲取第一個(gè)a之前的(不為a的)所有字符。^可作用于多個(gè)條件,如^a-z=表示^a-z且^=(既非小寫(xiě)字母亦非等號(hào))??兆址?[]和%[^]會(huì)導(dǎo)致不可預(yù)知的結(jié)果。

     使用[]時(shí)接收輸入的參數(shù)必須是有足夠存儲(chǔ)空間的char、signed charunsigned char數(shù)組。[]也是轉(zhuǎn)換符,故%[]后無(wú)s。

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

     2) n:至此已讀入值(未必賦值)的等價(jià)字符數(shù),該數(shù)目必須以int類型存儲(chǔ)。如"10,22"經(jīng)過(guò)"%d%*[^0-9]%n"格式轉(zhuǎn)換后,%n對(duì)應(yīng)的參數(shù)值為3(雖然','未參與賦值)。

     'n'并非轉(zhuǎn)換符,盡管它可用'*'抑制。C標(biāo)準(zhǔn)聲稱,執(zhí)行%n指令并不增加函數(shù)返回的賦值次數(shù);但其勘誤表中的描述與之矛盾。建議不要假設(shè)%n對(duì)返回值的影響。

 

下表列舉sscanf函數(shù)常見(jiàn)的格式化用法:

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

    【例1】讀入一行字符串

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

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

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

     若不確定行首有無(wú)空白字符,可先跳過(guò)空白字符:

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

    【例3】分解URL

     普通實(shí)現(xiàn)如下所示:

/*****************************************************************************
 * 函數(shù)名稱:OaSplitPwFarEndIpInfo
 * 功能描述:將遠(yuǎn)端IP信息分解為目的IP地址和端口號(hào)
 * 注意事項(xiàng):遠(yuǎn)端IP信息應(yīng)形如'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; //避免未配置端口時(shí)陷入死循環(huán)(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格式化則更為簡(jiǎn)單:

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】提取數(shù)字

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); 
}

     上述實(shí)現(xiàn)稍加改造,即可用于處理某種字符分隔的數(shù)字串。

總結(jié) 

     綜上,對(duì)于簡(jiǎn)單的字符串分析,采用sscanf函數(shù)處理比較簡(jiǎn)潔。若字符串比較復(fù)雜,則可借助相應(yīng)的正則表達(dá)式庫(kù)。需要注意,sscanf格式化的目的是“截取”,而正則表達(dá)式的目的是“匹配”,不能完全等同。

     以上就是本文的全部?jī)?nèi)容改了,希望對(duì)大家的學(xué)習(xí)能有所幫助,如果疑問(wèn)的話歡迎大家留言討論。

相關(guān)文章

  • C/C++中四種常用查找算法的實(shí)現(xiàn)

    C/C++中四種常用查找算法的實(shí)現(xiàn)

    C語(yǔ)言作為一種強(qiáng)大的編程語(yǔ)言,提供了多種搜索算法的實(shí)現(xiàn)方式,本文將介紹C語(yǔ)言中的四種常見(jiàn)搜索算法并提供每種算法的簡(jiǎn)單實(shí)現(xiàn)示例,需要的小伙伴可以參考下
    2023-11-11
  • C語(yǔ)言實(shí)現(xiàn)打印九九乘法表的四種方式小結(jié)

    C語(yǔ)言實(shí)現(xiàn)打印九九乘法表的四種方式小結(jié)

    這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)打印九九乘法表的四種方式,文中的示例代碼講解詳細(xì),簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • C語(yǔ)言全排列回溯算法介紹

    C語(yǔ)言全排列回溯算法介紹

    大家好,本篇文章主要講的是C語(yǔ)言全排列回溯算法介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C語(yǔ)言指針之必須要掌握的指針基礎(chǔ)知識(shí)

    C語(yǔ)言指針之必須要掌握的指針基礎(chǔ)知識(shí)

    這篇文章主要介紹了C語(yǔ)言指針必須要掌握的基礎(chǔ)知識(shí),文中實(shí)例講解的很清晰,有不太懂的同學(xué)可以研究下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • C++ open()和read()函數(shù)使用詳解

    C++ open()和read()函數(shù)使用詳解

    這篇文章主要介紹了C++中open()和read()函數(shù)的使用方法和參數(shù),open()函數(shù)用于打開(kāi)文件并返回文件描述符,read()函數(shù)用于從文件描述符中讀取數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • C語(yǔ)言順序表的實(shí)現(xiàn)代碼

    C語(yǔ)言順序表的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)順序表的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • C++實(shí)現(xiàn)拓?fù)渑判颍ˋOV網(wǎng)絡(luò))

    C++實(shí)現(xiàn)拓?fù)渑判颍ˋOV網(wǎng)絡(luò))

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)拓?fù)渑判?,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++掃雷游戲的簡(jiǎn)單制作

    C++掃雷游戲的簡(jiǎn)單制作

    這篇文章主要為大家詳細(xì)介紹了C++掃雷游戲的簡(jiǎn)單制作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Linux?C/C++實(shí)現(xiàn)顯示NIC流量統(tǒng)計(jì)信息

    Linux?C/C++實(shí)現(xiàn)顯示NIC流量統(tǒng)計(jì)信息

    NIC流量統(tǒng)計(jì)信息是由操作系統(tǒng)維護(hù)的,當(dāng)數(shù)據(jù)包通過(guò)NIC傳輸時(shí),操作系統(tǒng)會(huì)更新相關(guān)的計(jì)數(shù)器,通過(guò)讀取這些計(jì)數(shù)器,我們可以獲得關(guān)于網(wǎng)絡(luò)流量的信息,下面我們就來(lái)學(xué)習(xí)一下如何通過(guò)C/C++實(shí)現(xiàn)顯示NIC流量統(tǒng)計(jì)信息吧
    2024-01-01
  • 詳解C語(yǔ)言中printf輸出的相關(guān)函數(shù)

    詳解C語(yǔ)言中printf輸出的相關(guān)函數(shù)

    這篇文章主要介紹了C語(yǔ)言中printf輸出的相關(guān)函數(shù)總結(jié),是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08

最新評(píng)論

宿州市| 曲阜市| 通化市| 柳州市| 额济纳旗| 宣威市| 永泰县| 车险| 顺昌县| 遂平县| 沙田区| 南澳县| 林西县| 五大连池市| 关岭| 和林格尔县| 丰城市| 吴桥县| 朝阳县| 溧阳市| 兰溪市| 南昌县| 云阳县| 巩义市| 丹江口市| 娱乐| 惠安县| 开化县| 汉沽区| 边坝县| 甘肃省| 乌拉特中旗| 宝应县| 武邑县| 巫山县| 松溪县| 东乌珠穆沁旗| 莲花县| 顺义区| 岚皋县| 元阳县|