亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

介紹

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

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

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

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

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

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

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

     3) {h | l | L}為類型修飾符。h指示輸入的數(shù)字數(shù)值以short intunsigned short int類型存儲;hh指示輸入以signed charunsigned char類型存儲。l(小寫L)指示輸入以long int、unsigned 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且^=(既非小寫字母亦非等號)??兆址?[]和%[^]會導致不可預知的結果。

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

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

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

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

 

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

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

    【例1】讀入一行字符串

     因字符串可能含空白字符,故不能直接使用%s;而gets函數(shù)存在溢出風險,不推薦使用。此時,可使用sscanf函數(shù),格式化字符串設為"%[^\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

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

/*****************************************************************************
 * 函數(shù)名稱: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; //避免未配置端口時陷入死循環(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格式化則更為簡單:

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

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

總結 

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

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

相關文章

  • C++實現(xiàn)掃雷小游戲(控制臺)

    C++實現(xiàn)掃雷小游戲(控制臺)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Qt使用QCamera實現(xiàn)切換相機,分辨率和圖像捕獲功能

    Qt使用QCamera實現(xiàn)切換相機,分辨率和圖像捕獲功能

    這篇文章主要為大家介紹了如何利用Qt中的相機類QCamera,取景器類QCameraViewfinder,圖像捕獲類QCameraImageCapture實現(xiàn)切換相機、分辨率和圖像捕獲功能,需要的可以了解一下
    2023-04-04
  • C++獲取項目路徑的兩種方式詳解

    C++獲取項目路徑的兩種方式詳解

    這篇文章主要介紹了C++獲取項目路徑的兩種方式的相關資料,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • 實戰(zhàn)開發(fā)為單片機的按鍵加一個鎖防止多次觸發(fā)的細節(jié)

    實戰(zhàn)開發(fā)為單片機的按鍵加一個鎖防止多次觸發(fā)的細節(jié)

    今天小編就為大家分享一篇關于實戰(zhàn)開發(fā)為單片機的按鍵加一個鎖防止多次觸發(fā)的細節(jié),小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言編程使用MATLAB繪制橢圓及圓角矩形

    C語言編程使用MATLAB繪制橢圓及圓角矩形

    這篇文章主要為大家介紹了C語言編程中使用MATLAB繪制橢圓及圓角矩形的實現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • 一文總結C++運算符的使用方法

    一文總結C++運算符的使用方法

    這篇文章主要為大家詳細總結了C++中運算符的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • 淺談C++有理數(shù)的表達和計算

    淺談C++有理數(shù)的表達和計算

    這篇文章主要為大家詳細介紹了C++有理數(shù)的表達和計算,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言三種方法解決輪轉數(shù)組問題

    C語言三種方法解決輪轉數(shù)組問題

    這篇文章主要給大家講解輪轉數(shù)組的問題,一個問題不局限于一種解法,希望你看了本文的解決方法以后可以舉一反三自己編寫,這樣你的技術水平會有質的提高
    2022-04-04
  • C++實現(xiàn)LeetCode(63.不同的路徑之二)

    C++實現(xiàn)LeetCode(63.不同的路徑之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(63.不同的路徑之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C++ stringstream類用法詳解

    C++ stringstream類用法詳解

    這篇文章主要介紹了C++ stringstream類用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08

最新評論