天天看點

sscanf類似于正規表達式的進階用法前言用法示例總結

前言

用C++處理字元串時總是很苦惱,作為一種接近于底層的語言,工具函數總覺得不夠使,腦子裡過一遍也就隻能想起

strcpy

strcat

strlen

strstr

等幾個常用的字元串處理函數,相比于Lua、Python等解釋型語言來說真是少得可憐,其實利用僅有的這幾個函數也能處理大部分的問題,隻是代碼寫起來比較麻煩罷了。

今天恰好有個需求,去掉所給字元串前端固定格式的部分,保留後面的内容,這個工作聽起來挺容易,隻要使用

strstr

函數就可以搞定,但是如果使用這個函數,我就不得不做一些有效性判斷,無法避免的增加了代碼行數,有沒有辦法直接把指定的内容取出來呢?當然可以,這時我想起了

sscanf

函數,話說這個函數可以支援一定格式的比對,但是和正規表達式來比的話還差了一大截,是以如果你隻是做簡單的比對還沒有問題,複雜的操作隻能祭出正規表達式這個大殺器了!

用法

函數的聲明很簡單

int sscanf(const char *buffer, const char *format, [ argument ]...);

其中最重要的參數就是

format

,它可以是一個或多個

{%[*][width][{h|I|I64|L}]type|' '|'\t'| '\n'|非%符号}

,其中有一些具體的解釋,我摘錄在此處:

  1. *也可以用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳過此資料不讀入,也就是不把此資料讀入參數中。
  2. {a|b|c}表示a,b,c中選一,[d]表示可以有d也可以沒有d。
  3. width表示讀取寬度。
  4. {h | l | I64 | L}:參數的size,通常h表示單位元組size,I表示2位元組 size,L表示4位元組size(double例外),l64表示8位元組size。
  5. type:這一項比較多,就是%s、%d之類。
  6. 特别的:%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會向目标參數中寫入值。
  7. 未成功比對傳回0 ,否則傳回格式化的參數個數。

示例

先來說說我實際遇到的問題,就是要取到類似于

[100]test

這個字元串裡面中括号之後的部分,最後經過試驗format的寫法應該是

"%*[[]%*d%*[]]%s"

,接下來我們來看看這個

sscanf

函數的具體用法:

一般使用

int id, level;
sscanf("10|2", "%d|%d", &id, &level);
           
id = 10, level = 2

取指定長度的字元串

char result[] = {};
sscanf("this is a test!", "%3s", result);
           
result = thi

取指定字元結尾的字元串

char result[] = {};
sscanf("this is a test!123", "%[^0-9]", result);
           
result = this is a test!

取/和@之間的字元串

char result[] = {};
sscanf("iios/[email protected]", "%*[^/]/%[^@]", result);
           
result = 12DDWDFF

總結

  1. 遇到上述沒有提到的用法可以自己先嘗試一下,由易入難,不斷測試,直到滿足需求。
  2. sscanf

    的功能很類似于正規表達式, 但卻沒有正規表達式強大,是以如果對于比較複雜的字元串處理,建議使用正規表達式。

繼續閱讀