前言
用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'|非%符号}
,其中有一些具體的解釋,我摘錄在此處:
- *也可以用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳過此資料不讀入,也就是不把此資料讀入參數中。
- {a|b|c}表示a,b,c中選一,[d]表示可以有d也可以沒有d。
- width表示讀取寬度。
- {h | l | I64 | L}:參數的size,通常h表示單位元組size,I表示2位元組 size,L表示4位元組size(double例外),l64表示8位元組size。
- type:這一項比較多,就是%s、%d之類。
- 特别的:%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會向目标參數中寫入值。
- 未成功比對傳回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
總結
- 遇到上述沒有提到的用法可以自己先嘗試一下,由易入難,不斷測試,直到滿足需求。
-
的功能很類似于正規表達式, 但卻沒有正規表達式強大,是以如果對于比較複雜的字元串處理,建議使用正規表達式。sscanf