sscanf的高級用法

?sscanf的高級用法(總結)?2012-04-25 18:50:25

分類:?C/C++

?

sscanf(recvbuf,"%*[^/]/%[^ ]s",buf_rev);?
?sscanf(buf, "GET /%[^ ]", buf_rev);

?
這個是在一個webserver.c里面的例子,通過sscanf()語句可以找到和它前面相匹配的語句然后打印出后面需要的東西,下面說下%[]:
其基本格式為 %[set],表示將接收一個由set指定格式的字符串,其中set表示可接受的字符集合。
set一般有兩種情況:
一種是"^set"表示非, 即在輸入的字符串中將匹配所有不在set中出現的字符,
????????? 遇到set中的字符時停止匹配。
??????????????? 另一種是"set"表示在輸入的字符串中將匹配所有在set中出現的字符,
????????? 遇到非set中的字符時停止匹配。
如:
?scanf("%[^&]",buf); //當輸入的字符中出現"&"時停止匹配,如果輸入hello&world,則buf=hello;
?scanf("%[^290#*]",buf); //當輸入aidc#ad時,則buf=aidc,
?????? 即當輸入出現了"#"時不再將輸入內容放入buf
?scanf("%[dlza#i]",buf);//只匹配"dlza#i"這幾個字符,
?????? 如果不是這幾個字符則停止匹配,如當輸入ai#dcad時,buf=ai#d,因為c不在[dlza#i]中.
?
特殊情況:
(1)如果要匹配"^"時,當然不能直接放在[]中,所以可以用%[ab^cd]這種方式,
?? (2)當要匹配右方括號"]"時,應把其放在set中第一個位置,如"%[]abc]"表示匹配的字符集為{], a, b, c},又如"%[^]abc]"表示匹配所有非"], a, b, c"中的字符
另外,還可以使用"-" 如%[a-z]表示只匹配abcd....yz等小寫的字母;
?? %[0-9]表示只匹配0,1,2...9等數字;
(3) * 表示跳過,如:
int main()
{
?char buf[100]="123:asdfasd:2342342:liman:host:34234:hello";
?char user[20]="";
?char host[20]="";
?char msg[20]="";
?int cmd = 0;?
?sscanf(buf, "%*d:%*[^:]:%*[^:]:%[^:]:%[^:]:%d:%s", user, host, &cmd, msg);
?return 0;
}
結果:user="liman",host="host",cmd=34234,msg=hello
??? 注意,“-”的字符只有在其左右兩邊都有有效字符時才有這個作用,否則被認為是普通字符,如“a-c-e-g”匹配的字符為{a, b, c, -, e, f, g},這樣也為輸入“-”字符提供了方法。
sscanf函數的高級用法
sscanf與scanf類似,都是用于輸入的,只是后者以屏幕(stdin)為輸入源,前者以固定字符串為輸入源。
函數原型:
int scanf( const char *format [,argument]... );
其中的format可以是一個或多個:
{%[*][width][{h|l|I64|L}]type|' '|'\t'|'\n'|非%符號},
注:
1)、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數據不讀入。
?(也就是不把此數據讀入參數中)?
2)、{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。?
3)、width:寬度,一般可以忽略,用法如:
const? char sourceStr[] = "hello, world";
char buf[10] = {0};
sscanf(sourceStr, "%5s", buf);?? //%5s,只取5個字符
cout << buf<< endl;
結果為:hello
4)、{h|I|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 表示滿足該條件的被過濾掉,
?不會向目標參數中寫入值。如:
const char sourceStr[] = "hello, world";
char? buf[10] = {0};
sscanf(sourceStr, "%*s%s", buf);
//%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了
cout << buf<< endl;
結果為:world
5)、支持集合操作:
%[a-z]? 表示匹配a到z中任意字符,貪婪性(盡可能多的匹配)
%[aB']? 匹配a、B、'中一員,貪婪性
%[^a]?? 匹配非a的任意字符,貪婪性
和正則表達式很相似,而且仍然支持過濾,即可以有%*[a-z]。
例子:
1. 常見用法。
char buf[512] = {0};
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
結果為:123456?
2. 取指定長度的字符串。如在下例中,取最大長度為4字節的字符串。
??? sscanf("123456 ", "%4s", buf);
?printf("%s\n", buf);
?結果為:1234?
3. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。
??? sscanf("123456 abcdedf", "%[^ ]", buf);
?printf("%s\n", buf);
?結果為:123456?
4.? 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
??? sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
?printf("%s\n", buf);
?結果為:123456abcdedf?
5.? 取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。
??? sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
?printf("%s\n", buf);
?結果為:123456abcdedf?
6、給定一個字符串iios/12DDWDFF@122,獲取 / 和 @ 之間的字符串,
?先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中
?sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
?printf("%s\n", buf);
?結果為:12DDWDFF?
7、給定一個字符串““hello, world”,僅保留world。(注意:“,”之后有一空格)
?sscanf(“hello, world”,? "%*s%s",? buf);??
?printf("%s\n", buf);
?結果為:world
?%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了,如果沒有空格則結果為NULL。?
8、分隔字符串2006:03:18
?int a, b, c;
?sscanf("2006:03:18", "%d:%d:%d", a, b, c);?
9、分隔字符串2006:03:18 - 2006:04:18
?char sztime1[16] = "", sztime2[16] = "";
?sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);?
10、分隔字符串2006:03:18-2006:04:18
?char sztime1[16] = "", sztime2[16] = "";
?sscanf("2006:03:18-2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);
?僅僅是取消了‘-’兩邊的空格,卻打破了%s對字符串的界定format-type中有%[]這樣的type ?field。如果讀取的字符串,不是以空格來分隔的話,就可以使用%[]。%[]類似于一個正則表達式。?[a-z]表示讀取a-z的所有字符,[^a-z]表示讀取除a-z以外的所有字符。?
?sscanf的功能很類似于正則表達式, 但卻沒有正則表達式強大,所以如果對于比較復雜的字符串處?理,建議使用正則表達式.
正則表達式的基本用法:
1、“.”為通配符,表示任何一個字符,例如:“a.c”可以匹配“anc”、“abc”、“acc”;
2、“[]”,在[]內可以指定要求匹配的字符,例如:“a[nbc]c”可以匹配“anc”、“abc”、"acc";但不可以匹配“ancc”,a到z可以寫成[a-z],0到9可以寫成[0-9];
3、數量限定符號,表示匹配次數(或者叫做長度)的符號,包括:
“*”? 0次或者多次
“+”? 1次或者多次
“?”? 0次或者1次
“{n}”??? 匹配n次,n為整數
“{n,m}”? 匹配從n到m之間的某個數的次數;n和m都是整數;
“{n,}”?? 匹配n到無窮次之間任意次數;
“{,m}”?? 匹配0到m之間任意次數;
數量限定符號放到匹配格式的后面,例如:電話號碼:024-84820482,02484820482(假設前面3或者4位,后面7或者8位,并且中間的減號可有可無),都是符合規定的,那么可以用如下格式來匹配:[0-9]{3,4} \-? [0-9]{7,8};注意:“\”為轉義字符,因為“-”在正則表達式用有代表一個范圍的意義,例如:前面所說的[0-9],所以它需要轉義字符“\”進行轉義才可使用;
4、^為否符號,表示不想匹配的符號,例如:[^z][a-z]+可以匹配所有除"z"開頭的以外的所有字
如果^放到[]的外邊則表示以[]開頭的字符串;^[az][a-z]+表示a或者z開頭的長度大于等于2的英文字符串;
5、“|”或運算符,例如:a[n|bc|cb]c可以匹配“abcc”,“anc”,“acbc”;
6、“$”以它前面的字符結尾的;例如:ab+$就可以被“abb”,“ab”匹配;
7、一些簡單表示方法:\d表示[0-9];\D表示[^0-9];\w表示[A-Z0-9];\W表示[^A-Z0-9];\s表示[\t\n\r\f],就是空格字符包括tab,空格等等;\S表示[^\t\n\r\f],就是非空格字符;

轉載于:https://www.cnblogs.com/I-L-o-v-e-z-h-o-u/p/4963931.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458668.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458668.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458668.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

選擇排序 冒泡排序 二分查找

選擇排序 int [] arr {2,48,28,32,90,12}; for&#xff08;int i 0&#xff1b; i < arr.length - 1;i&#xff09;{ for(int j i 1; j < arr.length;j){ if(arr[i] < arr[j]){ int c; c arr[i]; arr[i] arr[j]; arr[j] c; } } } 冒泡排序 for(int i 0;i <…

C++, ID、指針、handle (void *)的區別

原文鏈接&#xff1a; http://hi.baidu.com/dandanfeng160/blog/item/4eaa3df5215bc42dbd310955.html 在Windows程序設計中&#xff0c;句柄是無法精確定義的術語。隨便找一個高手&#xff0c;讓他給你講講句柄是什么&#xff0c;恐怕他都很難給你一個具體的定義來。 在Wind…

Swift調用Objective C的FrameWork

很多Github的庫經過很多年的發展&#xff0c;源碼都是OC寫的&#xff0c;&#xff0c;所以&#xff0c;用Swift調用OC的庫就是開發中難免遇到的的一個問題&#xff0c;本文以AFNetworking為例&#xff0c;講解如何跨語言調用。 第一步 創建一個空的工程 注意&#xff0c;語言選…

命令行 java文本編輯工具 重載 內存區域 棧 堆

一、dir 列出當前目錄下的文件以及文件夾 md創建目錄 rd刪除目錄 cd 進入指定目錄 cd..返回到上一級目錄 &#xff1a; 切換盤符 比如&#xff1a; F: 二、editPlus 編寫程序 三、重載&#xff1a;在同一個class中&#xff0c;出現了函數名稱相同&#xff0…

數據結構(Java)——查找和排序(1)

1.查找的定義 查找是這樣一個過程&#xff0c;即在某個項目組中尋找某一指定目標元素&#xff0c;或者確定該組中并不存在該目標元素。 對其進行查找的項目的組有時也成為查找池。兩種常見的查找方式&#xff1a;線性查找和二分查找。為了能夠查找某一對象&#xff0c;我們就必…

GetProcAddress()用法

函數功能描述: GetProcAddress()函數檢索指定的動態鏈接庫(DLL)中的輸出庫函數地址。 函數原型&#xff1a; FARPROC GetProcAddress( HMODULE hModule, // DLL模塊句柄 LPCSTR lpProcName // 函數名 ); 參數&#xff1a; hModule [in] 包含此函數的…

支付寶問題LaunchServices: ERROR: There is no registered handler for URL scheme alipay

LaunchServices: ERROR: There is no registered handler for URL scheme alipay &#xff08;這句話其實是在告訴你 設備上沒有安裝 支付寶的客戶端,此時會走網頁端&#xff09;而有人會發現并沒有HTML5網頁彈出過一會&#xff0c;會發現服務器返回4000支付失敗&#xff0c;這…

C++string類常用函數 c++中的string常用函數用法總結

string類的構造函數&#xff1a; string(const char *s); //用c字符串s初始化 string(int n,char c); //用n個字符c初始化 此外&#xff0c;string類還支持默認構造函數和復制構造函數&#xff0c;如string s1&#xff1b;string s2"hello"&#xff1b;都是正…

排列與組合

話說&#xff0c;初一的時候看到這樣一道題&#xff1a;有一種彩票中獎率為1%&#xff0c;買一百張是不是一定能中獎&#xff1f;答案自然是否定的&#xff0c;但我在想&#xff0c;如果有200張彩票&#xff0c;兩張有獎&#xff0c;買一百張中獎率是多少&#xff1f;一天晚上睡…

剔除服務器返回的NSNull格式的數據

服務器返回NSNull格式的數據&#xff0c;真。。的煩人 解決辦法&#xff1a;在AFN請求里面加上下面兩段代碼&#xff0c;OK AFJSONResponseSerializer *response (AFJSONResponseSerializer *)manager.responseSerializer; response.removesKeysWithNullValues YES;

顯式(靜態)調用: LIB + DLL + .H

1、編程時用ad.h,ad.lib,放在項目當前目錄里2、在頭文件中加入#include "ad.h"3、在Project Setting–>Link–>Object/library modules加入ad.lib執行時將ad.dll跟你的程序放在同一目錄。 就可以直接調用dll中的函數了 當前目錄 轉載于:https://www.cnblogs.co…

boost Mutex

寫過多線程程序的人都知道&#xff0c;不能讓多個線程同時訪問共享的資源是至關重要的。 假如一個線程試圖改變共享數據的值&#xff0c;而另外一個線程試圖去讀取該共享數據的值&#xff0c;結果將是未定義的。 為了阻止這樣的事情發生&#xff0c;需要用到一些非凡的原始數據…

接入支付寶出現交易訂單處理失敗,請稍后再試(ALI64)的錯誤

上次在接入支付寶的時候就碰到了交易訂單處理失敗&#xff0c;請稍后再試&#xff08;ALI64&#xff09;這樣的錯誤&#xff0c;后來經過排查和總結&#xff0c;一般來講這種問題都是公鑰和私鑰沒有正確配置造成的。支付寶這邊為了保證數據在傳輸時不被篡改&#xff0c;使用了r…

c中session的用法

c中session的用法你知道嗎&#xff1f;下面小編就跟你們詳細介紹下c中session的用法&#xff0c;希望對你們有用。c中session的用法如下&#xff1a;Session的基本屬性&#xff1a;一、屬性1、SessionIDSessionID 屬性返回用戶的會話標識。在創建會話時&#xff0c;服務器會為每…

查看硬件信息

測試機器的硬件信息&#xff1a; 查看CPU信息&#xff08;型號&#xff09; # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 8 Intel(R) Xeon(R) CPU E5410 2.33GHz (看到有8個邏輯CPU, 也知道了CPU型號) # cat /proc/cpuinfo | grep physical …

支付寶集成交互流程

交互流程 功能流程 流程說明&#xff08;以Android平臺為例&#xff09;&#xff1a; 第4步&#xff1a;調用支付接口&#xff1a;此消息就是本接口所描述的開發包提供的支付對象PayTask&#xff0c;將商戶簽名后的訂單信息傳進pay方法喚起支付寶收銀臺&#xff0c;訂單格式具體…

VxLAN基礎

轉自&#xff1a;http://blog.csdn.net/freezgw1985/article/details/16354897 一 . 為什么需要Vxlan1. vlan的數量限制4096個vlan遠不能滿足大規模云計算數據中心的需求2. 物理網絡基礎設施的限制基于IP子網的區域劃分限制了需要二層網絡連通性的應用負載的部署3. TOR交換機MA…

find_first_of()和 find_last_of() 【獲取路徑、文件名】

string 類提供字符串處理函數&#xff0c;利用這些函數&#xff0c;程序員可以在字符串內查找字符&#xff0c;提取連續字符序列(稱為子串)&#xff0c;以及在字符串中刪除和添加。我們將介紹一些主要函數。 1.函數find_first_of()和 find_last_of() 執行簡單的模式匹配&#x…

支付寶集成

memo Error Domain系統繁忙&#xff0c;請稍后再試 Code1000 "(null)" reslut {memo "Error Domain\U7cfb\U7edf\U7e41\U5fd9\Uff0c\U8bf7\U7a0d\U540e\U518d\U8bd5 Code1000 \"(null)\"";result "";resultStatus 4000;} 請問安裝…

servlet中實現頁面跳轉return “r:”和return “f:

servlet中實現頁面跳轉return “r&#xff1a;”和return “f&#xff1a;”的區別和作用 分享| 2015-07-28 14:22741830480 | 瀏覽 48 次Pascal2015-07-28 14:26 #知道行家專業創造價值&#xff0c;火熱招募中&#xff01;#提問者采納熱心網友r是redirect重定向&#xff0c;參…